4

ArrayList をソートしようとしていました。

java.util.ArrayList arList= new java.util.ArrayList();  
   arList=getList();    
   java.util.Collections.sort(arList);

私の getList() 関数はここにあります

public ArrayList getList() throws Exception
{
ArrayList listItems = new ArrayList();
//Query executing here..............!
            while (rs.next()) 
                {
                HashMap hashList = new HashMap();
                hashList.put("name",rs.getString(1));
                hashList.put("id",rs.getBigDecimal(2));
                listItems.add(hashList);
                }
          return listItems;
}

しかし、私はエラーに直面しています: java.lang.ClassCastException: java.util.HashMap を java.lang.Comparable にキャストできません

4

11 に答える 11

5

最初のこと-

java.util.ArrayList arList= new java.util.ArrayList();  
arList=getList();    

不要な最初のインスタンスを作成します。

第二のこと-

ArrayList listItems = new ArrayList();

このリストにはリスト HashMap が含まれており、HashMap は Comparable を実装していません。

java.util.Collections.sort(arList);

public static <T extends Comparable<? super T>> void sort(List<T> list)

List contains( T) は Comparable を拡張する必要があります。

それが人口を占める理由ですjava.lang.ClassCastException: java.util.HashMap cannot be cast to java.lang.Comparable

于 2012-09-26T05:42:20.060 に答える
3

を使用するために、このインターフェイスComparableCollections.sort()を実装するオブジェクトのリスト (および配列) 。http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html

于 2012-09-26T05:41:44.840 に答える
2

このようにして、ソートされたマップを実現できます

public class MapUsingSort {
public static void main(String[] args) {

Map<Integer, String> abc = new HashMap<>();
abc.put(3, "a");
abc.put(6, "b");
abc.put(1, "c");
abc.put(4, "h");
abc.put(10, "k");
abc.put(9, "x");

 // Map is stored in ArrayList
List<Entry<Integer,String>> sortedEntries = new ArrayList<Entry<Integer,String>>(abc.entrySet());


Collections.sort(sortedEntries, new Comparator<Entry<Integer,String>>() {
    @Override
    public int compare(Entry<Integer, String> a, Entry<Integer, String> b) 
    {
        //Sorting is done here make changes as per your need 
        // swap a and b for descending order 

        return a.getKey().compareTo(b.getKey());   
    }
   });

for (Object object : sortedEntries) {

    //print your data in your own way
    System.out.println((Map.Entry)object);
   }
  }
}

詳細については、ハッシュマップをご覧ください

*

これは、stackOverflow に関する私の最初の回答です。

于 2018-04-04T06:23:38.920 に答える
1

まず第一に、あなたのコードは奇妙に思えます。ループの各反復で、新しく作成された HashMap オブジェクトをリストに追加しています。とにかく、私はそれについて議論しません。ArrayList を次のように指定する必要があるかもしれません:ArrayList<HashMap> しかし、それだけでは不十分です。特定のタイプのリストがあり、それらを並べ替えたい場合は、タイプ(この場合は HashMap) にComparableインターフェイスを実装する必要があります。ComparableHashMap はインターフェースを実装していません。API を読む: http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html

独自のComparatorをソリューションとして実装する必要があると思います。

于 2012-09-26T05:38:35.033 に答える
1

このリンクを確認してください

リスト内のすべての要素は Comparable インターフェースを実装する必要があります。さらに、リスト内のすべての要素は相互に比較可能でなければなりません (つまり、e1.compareTo(e2) は、リスト内の要素 e1 および e2 に対して ClassCastException をスローしてはなりません)。

これはすべてを言うべきです。

于 2012-09-26T05:38:53.193 に答える
1

もちろん、コンパイラエラーは、比較できないことHashMaps、リスト内にあることをできる限り最善の方法で伝えようとしています..

最初に、次のようにリストを一般的なリストとして宣言する必要があります: -

List<HashMap<String, String>> hashList = new ArrayList<>();

並べ替えたい場合は、並べ替えるList<HashMap>必要がありComparatorます。自然順序付けを使用して並べ替えることはできません。インターフェイスHashMapを実装していないためです。Comparable

比較できる場合にのみ、2 つのインスタンスを比較できます。

Comparators*編集: -ここでは 2 つ必要になると思います.1 つはあなた用List、もう 1 つはHashMap内部用Listです..しかし、それが機能するかどうかはよくわかりません..

于 2012-09-26T05:39:20.730 に答える
1

Collections.sort(List<T>)Tタイプのオブジェクトが必要Comparableです。つまり、 Comparable インターフェイスを実装するオブジェクトはすべて機能します。[これ]( http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#sort%28java.util.List%29 )を参照してください:

 public static <T extends Comparable<? super T>> void sort(List<T> list)

あなたの場合、インターフェースを実装していないArrayListを含むをソートしようとしています。そう。コードは失敗します。HashMapComparable

于 2012-09-26T05:39:53.100 に答える
1

HashMap は Comparable インターフェースを実装していません (http://docs.oracle.com/javase/6/docs/api/)。私の知る限り、 Collections.sort()-Method は自然値のみをソートできますが、独自のコンパレータを作成して、必要に応じてリストをソートできます。Collections.sort()-Method はオーバーロードされているため、

于 2012-09-26T05:39:57.160 に答える
1

何かをソートするには、Comparableインターフェースを実装する必要がありますが、これはHashMapには実装されていません。

その結果、HashMap のリストを並べ替えようとすると、コードが失敗します。

本当に HashMap を比較できるようにする必要がある場合は、次のように独自の HashMap を作成できます。

public class MyHashMap<K,V> extends HashMap<K, V> implements Comparable<HashMap<K,V>>
{
    ...
    public int compareTo(HashMap<K,V> comparer)
    {
        ...
    }
}
于 2012-09-26T05:40:49.023 に答える
1

はい、 残念ながら arList にはjava.util.Collections.sort(arList); hashMapが含まれているため 、 Collections.sort() メソッドはCollections.sort()メソッドの実装でソートされますHashMap hashList = new HashMap();Comparable or Comparator interface.

 Comparable or Comparator interface.
于 2012-09-26T05:47:31.787 に答える
0

Collections.sort() の行でエラーが発生したと思います。

ソートを使用する場合、リスト内のオブジェクトは Comparable でなければなりません。それ以外の場合、Javaはどのようにソートしますか?

HashMap は比較可能ではありません。HashMap を拡張し、 Comparable インターフェイスを実装できます。

于 2012-09-26T05:42:14.407 に答える