0

我将 arrayList 作为我的键存储在 TreeMap 中,但出现此异常

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");
 }

任何想法 ?谢谢

4

6 回答 6

5

树形图按排序顺序维护其键。该类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
        }
    });

或者,如果您不必按任何特定顺序维护密钥,请改用 a HashMap

于 2013-11-08T12:26:09.083 回答
2

ArrayLists不实现Comparable,因此您需要使用未排序的映射,例如HashMap ,或者使用此构造函数告诉TreeMap如何对您进行排序。ArrayLists

于 2013-11-08T12:28:06.297 回答
1

错误本身就表明了问题。ArrayList 类没有实现 java.lang.Comparable 接口TreeMap期望实现可比较接口的关键。因此,它导致了异常。

请参阅ArrayList 文档。

由于我们无法修改 ArrayList,您可以使用外部比较器使 ArrayList 作为 TreeMap 的键。您只需要覆盖其中的 compare() 方法。

于 2013-11-08T12:26:00.630 回答
0

如果你真的想使用 ArrayList 作为 TreeMap 中的键,那么你需要为它编写Comparator并传递是使用构造函数

在 Tree 中使用 List 作为键不是一个好主意,请检查您的设计。

于 2013-11-08T12:28:00.200 回答
0

您不能比较两个列表,您必须将列表更改为其他结构,或者使用 Comparable 接口创建自己的列表。好的解决方案是将列表包装在实现 Comparable 的新类中,并仅从接口实现此方法。

看看这个

public class Fruit implements Comparable<Fruit>{
     public int compareTo(Fruit compareFruit) {
    //your code here 
     }  
}

这个链接。希望能帮助到你。

于 2013-11-08T12:26:06.143 回答
0

鉴于其他答案所说List的 s 没有实现 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>();
于 2013-11-08T12:31:51.847 回答