将ArrayList <integer>存储为TreeMap Java </integer>中的键

时间:2013-11-08 12:19:19

标签: java map arraylist treemap

我在一个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");
 }

任何想法? 感谢

6 个答案:

答案 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 documentation.

由于我们无法修改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>();