我在一个TreeMap中存储了一个arrayList作为我的键,但是我得到了这个异常
java.lang.ClassCastException:java.util.ArrayList无法强制转换为java.lang.Comparable
我将数组的内容复制到ArrayList并尝试将该arrayList存储为Map中的键 我的代码是:
TreeMap< ArrayList<Integer> , Integer > bandsMap = new TreeMap< ArrayList<Integer> , Integer >();
ArrayList< Integer > erfcn = new ArrayList< Integer >();
for (int index = 0; index < frequencies.length; index++)
erfcn.add(frequencies[index]);
bandsMap.put( erfcn , band_number);
for (Integer value : bandsMap.values()) {
System.out.println("Value = " + value + "\n");
}
任何想法? 感谢
答案 0 :(得分:6)
树形图按排序顺序维护其键。 ArrayList
类没有定义任何排序,因此不能直接用作键。您可以提供外部比较器来强制执行订单,但您必须定义对您有意义的订单:
TreeMap<ArrayList<Integer>, Integer> bandsMap = new TreeMap<>(
new Comparator<ArrayList<Integer>>() {
public int compare(ArrayList<Integer> lst1, ArrayList<Integer> lst2) {
// return 1 if lst1 > lst2, 0 if equal, -1 if lst1 < lst2
}
});
或者,如果您不必按任何特定顺序维护密钥,请改用HashMap
。
答案 1 :(得分:2)
ArrayLists请勿实施Comparable,因此您需要使用未排序的地图,例如HashMap,或告诉TreeMap如何对this constructor进行排序1}}使用{{3}}。
答案 2 :(得分:1)
错误本身表示问题。 ArrayList类不实现java.lang.Comparable接口,TreeMap期望密钥实现类似的接口。因此它引起了异常。
由于我们无法修改ArrayList,您可以使用外部comparator使ArrayList作为TreeMap的键。你只需要覆盖它中的compare()方法。
答案 3 :(得分:0)
您无法比较两个列表,您必须将列表更改为其他结构,或使用Comparable接口创建自己的列表。好的解决方案也是在实现Comparable的新类中包装列表,并从接口实现这个方法。
看看这个
public class Fruit implements Comparable<Fruit>{
public int compareTo(Fruit compareFruit) {
//your code here
}
}
和this链接。希望它有所帮助。
答案 4 :(得分:0)
如果你真的想在TreeMap中使用ArrayList作为键,那么你需要为它编写Comparator并传递using constructor
在树中使用List作为键不是一个好主意,请检查您的设计。
答案 5 :(得分:0)
鉴于其他答案所说的List
没有实现Comparable,你可以创建自己的类来充当TreeMap键,扩展ArrayList并实现Comparable:
class KeyList extends ArrayList<Integer> implements Comparable<ArrayList<Integer>> {
public int compareTo(ArrayList<Integer> list) {
//decide how to compare ArrayLists, then implement it here
return 0;
}
}
然后你可以创建你的TreeMap:
new TreeMap<KeyList, Integer>();