【问题标题】:Storing ArrayList<Integer> as key in TreeMap Java将 ArrayList<Integer> 存储为 TreeMap Java 中的键
【发布时间】:2013-11-08 12:19:18
【问题描述】:

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

java.lang.ClassCastException:java.util.ArrayList 无法转换为 java.lang.Comparable

我将数组的内容复制到 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");
 }

有什么想法吗? 谢谢

【问题讨论】:

  • java.util.ArrayList cannot be cast to java.lang.Comparable。 List 没有扩展Comparable,则没有通过compareTo(T o) 方法定义比较操作。您不能用作地图键。
  • TreeMap 在添加之前比较键。你认为它将如何比较ArrayList 的两个实例?确定一个列表更小/更大/等于另一个列表的标准是什么?
  • 你要建楼吗?
  • 您真的需要List&lt;Integer&gt; 来获取密钥吗?你能想到一个可能的解决方法吗?
  • Multimap 存储值的集合。密钥集合不是一件正常的事情——你真的应该重新考虑你的设计。

标签: java map arraylist treemap


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      参考ArrayList documentation.

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

      【讨论】:

        【解决方案4】:

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

        看看这个

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

        和this 链接。希望对您有所帮助。

        【讨论】:

          【解决方案5】:

          如果你真的想在TreeMap中使用ArrayList作为key,那么你需要为它写Comparator并且pass是using constructor

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

          【讨论】:

            【解决方案6】:

            鉴于其他答案所说的 Lists 没有实现 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>();
            

            【讨论】:

              猜你喜欢
              • 2012-01-14
              • 1970-01-01
              • 2013-12-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-07-09
              相关资源
              最近更新 更多