1

マップを値でソートしようとしています。データ構造は次のとおりです。

Map<String, ArrayList<Object>>

ArrayListには、マップ内の文字列キー値に対応する名前を持つ一連のオブジェクトの一連のプロパティが含まれています。

アイデアは、これらのオブジェクトをプロパティで並べ替えたいということです。したがって、透明度がこれらのオブジェクトのプロパティであり、透明度がArrayList.get(3)すべてのオブジェクトに格納されているとしましょう。

次のように並べ替えるにはどうすればよいでしょうか。

私は出力することができます:

Transparency     Object Name
   Value            Name 1
   Value            Name 2
   Value            Name 3 
   Value            Name 4

いくつかの異なる種類を試しましたが、何も機能していないようです。何か案は?

編集:詳細。

arrayList 内のオブジェクトはすべて Double 型または String 型のいずれかであり、デフォルトの比較によって 2 つの値の比較を定義しています。基本的に、次のようにデータを整理しました。

プロパティがリストに含まれているオブジェクトの名前は、マップのキーです。キーによって与えられる値は、そのオブジェクトのプロパティのリストです。オブジェクト A のプロパティ (i) (i はユーザー入力) とオブジェクト B のプロパティ (i) を比較し、System.out.print() または printf() を使用して出力したい

4

1 に答える 1

1

比較メソッドが呼び出されたときに使用するインデックス値 aa 構成パラメーターを受け入れるクラスを使用して Comparator インターフェースを実装するのはどうですか? そして、 map.entrySet() で並べ替えますか?

例:

   import java.util.*;

public class AClass {

    static Map<String, List<Object>> myMap = new HashMap<>();
    static final int ALPHA_ZULU = 0;
    static final int SOME_DOUBLE = 1;

    public static void main(String[] args) {

        List<Object> l1 = new ArrayList<>();
        l1.add("CHARLIE");
        l1.add(new Double(1));
        List<Object> l2 = new ArrayList<>();
        l2.add("ZULU");
        l2.add(new Double(9));
        List<Object> l3 = new ArrayList<>();
        l3.add("ALPHA");
        l3.add(new Double(12));
        List<Object> l4 = new ArrayList<>();
        l4.add("XRAY");
        l4.add(new Double(4));

        myMap.put("one", l1);
        myMap.put("two", l2);
        myMap.put("three", l3);
        myMap.put("four", l4);


        List<Map.Entry<String, List<Object>>> meList = new ArrayList<>(myMap.entrySet());
        Collections.sort(meList, new MyComaprator(ALPHA_ZULU));

        for(Map.Entry me : meList) {
            System.out.println(me.getKey() + " = " + me.getValue());
        }

    }






}


class MyComaprator implements Comparator<Map.Entry<String,List<Object>>> {

    final int compareIndex;

    public MyComaprator(int compareIndex) {
        this.compareIndex = compareIndex;
    }

    @Override
    public int compare(Map.Entry<String, List<Object>> me1, Map.Entry<String, List<Object>> me2) {

        Object item1 = me1.getValue().get(compareIndex);
        Object item2 = me2.getValue().get(compareIndex);
        int compareResult = 0;

        if(item1 instanceof String && item2 instanceof String) {
            compareResult = ((String)item1).compareTo((String)item2);
        } else if(item1 instanceof Double && item2 instanceof Double) {
            compareResult = (int)((double)item1 - (double)item2);
        } else {
            // invalid comparison perhaps?
        }

        return compareResult;
    }
}
于 2013-09-18T21:00:44.853 に答える