2

ハッシュマップの配列があり、各ハッシュマップにはキーと値のペアとして24時間の時間が含まれています。

この配列を時間の昇順で並べ替えたいと思います。どうすればこれを達成できますか?

これが私のコードのスニペットです:

HashMap[] arr = new HashMap[100];

for(int i=0;i<100;i++) {
  HashMap<String,String> child=new HashMap<String,String>();
  child.put("some_time","21:09");  //time changes per iteration(time is in 24-hour format)
  arr[i]=child;
}
4

5 に答える 5

2

を使用できますArrays.sort(T[], Comparator<T>)。これにより、任意のタイプの配列を渡し、次のような独自のカスタムコンパレータメソッドを作成できます。

Arrays.sort(arr, new Comparator<HashMap>() {
    public int compare(HashMap o1, HashMap o2) {
        // Compare values you're interested in and return int as specified by Comparator API
    }
});

何を返すかの詳細については、APIを参照してください。

于 2012-10-25T13:22:47.163 に答える
2

これは、次のhh:mm形式の配列を時間どおりに並べ替える完全なコードです。

HashMap<String,String>[] harr = new HashMap[10];
final DateFormat df = new SimpleDateFormat("kk:mm");
// prepare your data
for(int i=0;i<harr.length;i++) {
   HashMap<String,String> child=new HashMap<String,String>();
   int ss = (int)(Math.random() * (59 + 1));
   //time changes per iteration(time is in 24-hour format)
   child.put("some_time", String.format("21:%02d", ss));
   harr[i]=child;
}
System.out.printf("map array is: %s%n", Arrays.deepToString(harr));

// now apply sort using a custom method
Arrays.sort(harr, new Comparator<HashMap<String,String>>() {
    public int compare(HashMap<String,String> o1, HashMap<String,String> o2) {
       String t1 = o1.get("some_time");
       String t2 = o2.get("some_time");
       try {
           Date dt1 = df.parse(t1);
           Date dt2 = df.parse(t2);
           return dt1.compareTo(dt2);
       } catch (ParseException e) {
           e.printStackTrace();
       }
       return 0;
    }
});
System.out.printf("sorted map array is: %s%n", Arrays.deepToString(harr));
于 2012-10-25T13:46:19.247 に答える
1

このアプローチを進める前に、コメントについて考え、ハッシュマップの配列が正しい方法であるかどうかを判断してください。私が指摘したように、それぞれが大量の情報を含み、1つのエントリが日付であるマップがたくさんある場合、これは正しいことかもしれません。その場合、配列を並べ替える最も簡単な方法は次のようになります。メソッドを使用するにはArrays.sort

HashMap[] arr=new Hashmap[100];

for(int i=0;i<100;i++){
    HashMap<String,String> child=new HashMap<String,String>();
    ... // put all the info into the HashMap
    child.put("some_time","21:09");  //time changes per iteration(time is in 24-hour format)
    arr[i]=child;
}

Arrays.sort(arr, new Comparator<HashMap>() {
    public int compare(HashMap o1, HashMap o2) {
        String d1 = o1.get("some_time");
        String d2 = o2.get("some_time");

        //compare the two dates.  If you're always in the same format, e.g. HH:MM (24 hours, two-digit hour, two-digit year), you might even be able to simply compare strings:
        return d1.compareTo(d2);
    }
});
于 2012-10-25T13:28:51.307 に答える
0

Bhavikが指摘しているように、JDKを最大限に活用していない可能性があります。SortedMapをご覧くださいこれはまさにあなたが探しているものかもしれません。おそらく、コンパレータの独自の実装を使用します。

SortedMap arr = new TreeMap<String,HashMap<String,String>>();
for ( int i=0 ; i<100 ; i++ )
{
    Map<String,String> child = HashMap<String,String>();
    child.put( "some_time" , "21:09" );
    arr.put( "21:09" , child );
}

次にarr.values().iterator()、ソートされたchildrenを取得するために使用できます。

乾杯、

于 2012-10-25T13:20:22.487 に答える
0

一般的なアプローチは、キーに基づいComparatorてオブジェクトのペアを順序付けるように記述し、それをパラメーターとしてメソッドに渡すことです。HashMapArrays.sort(T[], Comparator<T>)

コンパレータは次のようになります。

    Comparator<HashMap> DATE_ORDER = new Comparator<HashMap>() {
        public int compare(Comparator<HashMap>h1, Comparator<HashMap>h2) {
            String time1 = h1.get("some_time");
            String time2 = h2.get("some_time");
            return time1.compareTo(time2);  // assuming that the time strings
                                            // can be ordered that way
        }
    };

そうは言っても、あなたの問題には、実際にカスタムクラスを作成する必要があるときにマップを使用しようとする「匂い」があります。

于 2012-10-25T13:22:57.610 に答える