Re: Support Map<String, String> & Map<String, MyString>
On Oct 6, 10:03 pm, Lew <lewbl...@gmail.com> wrote:
albert kao wrote:
Lew wrote:
albert kao wrote:
The following programs work but I like to combine MyComboBox &
MyComboBox2 into one class so that both Map<String, String> &
Map<String, MyString> data types are supported in the single combined
class.
How to do that?
Have 'MyString' implement 'CharSequence' and use a 'Map<String,CharSeq=
uence>'?
public class MyComboBox extends LangComboBox implements
PropertyChangeListener {
protected EventListenerList listenerList = new EventListenerLis=
t();
private Set keySet = Collections.EMPTY_SET;
DO NOT USE RAW TYPES!
'MyString' do NOT implement 'CharSequence', so it cannot use a
'Map<String,CharSequence>'
I was suggesting that you change MyString. Obviously it doesn't implem=
ent that interface now, which is why I suggesting making that change. If=
it had already implemented 'CharSequence' you wouldn't be here asking your=
question. True?
No worries, you can use the 'Map<String, ?>' trick suggested upthread. =
Then you can use the same 'ComboBox' for either kind, assuming a suitabl=
e 'toString()' method for 'MyString'.
DO NOT USE RAW TYPES!
Code to check the type at run time is usually, and in your case definitel=
y a sign of incomplete design. Make your structures type safe at the com=
piler-enforced level.
And have I mentioned that you should not use raw types?
DO NOT USE RAW TYPES!
--
Lew
These are my test programs:
import java.util.HashMap;
import java.util.Map;
public class MyComboBox {
public MyComboBox(Map<String, ?> data) {
HashMap<String, String> sorted_map = (HashMap<String, String>)
MapUtil.sortByValue(data);
for (String key : sorted_map.keySet()) {
System.out.println("key/value: " + key +
"/"+sorted_map.get(key).toString());
}
}
public static void main(String[] args)
{
Map<String, String> map1 = new HashMap<String, String>();
map1.put("key1", "value1");
map1.put("key3", "value3");
map1.put("key2", "value2");
MyComboBox box1 = new MyComboBox(map1);
Map<String, MyString> map2 = new HashMap<String, MyString>();
MyString s1 = new MyString();
s1.setEnglish("test1");
MyString s2 = new MyString();
s1.setEnglish("test2");
MyString s3 = new MyString();
s1.setEnglish("test3");
map2.put("key1", s1);
map2.put("key3", s3);
map2.put("key2", s2);
MyComboBox box2 = new MyComboBox(map2);
}
} // MyComboBox
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class MapUtil {
public static <K, V> Map<K, V> sortByValue(Map<K, V> map) {
List<Map.Entry<K, V>> list = new LinkedList<Map.Entry<K, V>>(
map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<K, V>>() {
public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
return (o1.getValue()).equals(o2.getValue()) ? 1 : 0;
}
});
Map<K, V> result = new LinkedHashMap<K, V>();
for (Map.Entry<K, V> entry : list) {
result.put(entry.getKey(), entry.getValue());
}
return result;
}
public static <K, V extends Comparable<? super V>> Map<K, V>
sortByValue2(
Map<K, V> map) {
List<Map.Entry<K, V>> list = new LinkedList<Map.Entry<K, V>>(
map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<K, V>>() {
public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
return (o1.getValue()).compareTo(o2.getValue());
}
});
Map<K, V> result = new LinkedHashMap<K, V>();
for (Map.Entry<K, V> entry : list) {
result.put(entry.getKey(), entry.getValue());
}
return result;
}
} // MapUtil
// test class only because I don't have the actual source code
public class MyString {
String ls;
public MyString() {
//
}
public void setEnglish(String s) {
ls = s;
}
public void setFrench(String s) {
ls = s;
}
}
Running the test program has the following ClassCastException.
How to fix the problem?
key/value: key3/value3
key/value: key2/value2
key/value: key1/value1
Exception in thread "main" java.lang.ClassCastException: MyString
cannot be cast to java.lang.String
at MyComboBox.<init>(MyComboBox.java:10)
at MyComboBox.main(MyComboBox.java:32)