2013-11-08 4 views
0

Я храню в ArrayList, как мои ключи в TreeMap, но я получаю это исключениеСохранение ArrayList <Integer> как ключ в TreeMap Java

java.lang.ClassCastException: java.util.ArrayList не может быть приведен к Java. lang.Comparable

скопировать содержимое массива ArrayList и попытаться сохранить этот ArrayList как мои ключи в карте Мой код:

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

Любая идея? Thanks

+2

'java.util.ArrayList нельзя отнести к java.lang.Comparable'. 'List' не расширяет' Comparable', тогда на нем не определена операция сравнения с помощью метода compareTo (T o) '. Вы не можете использовать в качестве ключа карты. –

+1

'TreeMap' сравнивает ключи перед их добавлением. Как вы думаете, что это будет сравнивать два экземпляра 'ArrayList'? Каковы критерии, определяющие, что список меньше/больше/равен другому? –

+0

Вы хотите построить здание? –

ответ

1

Ошибка сама по себе указывает на проблему. Класс ArrayList не реализует java.lang.Comparable интерфейс, а TreeMap ожидает ключ для реализации сопоставимого интерфейса. Следовательно, это вызывает исключение.

См ArrayList documentation.

Как мы не можем изменить ArrayList, вы можете использовать внешний comparator сделать ArrayList работу в качестве ключа к TreeMap. Вам просто нужно переопределить метод compare().

0

Вы не можете сравнить два списка, вам нужно либо сменить список на какую-либо другую структуру, либо создать собственный список, используя интерфейс Comparable. Хорошим решением также является завершение списка в новом классе, который реализует Comparable и реализует именно этот метод из интерфейса.

Заканчивать этот

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

this и ссылка. Надеюсь, поможет.

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.

0

Если вы действительно хотите использовать ArrayList в качестве ключа в TreeMap, то вам нужно написать Comparator для него и проход using constructor

Использование списка в качестве ключа в дереве не является хорошей идеей, пожалуйста, просмотрите свой дизайн ,

0

Учитывая то, что другие ответы говорили о List s не реализует Сопоставимые, вы можете создать свой собственный класс, чтобы действовать в качестве ключей TreeMap, расширяя ArrayList и реализации Сопоставимые:

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>(); 
Смежные вопросы