0

文字列の配列があるとします:

String[] array = {
   "2183417234 somerandomtexthere",
   "1234123656 somemorerandomtexthere",
   "1093241066 andevenmore",
   "1243981234 you get what i mean",
   //etc

};

文字列の先頭に長い (長い) を使用してこの配列を並べ替えるにはどうすればよいので、最終的には次のようになります。

String[] array = {
   "1093241066 andevenmore",
   "1234123656 somemorerandomtexthere",
   "1243981234 you get what i mean",
   "2183417234 somerandomtexthere",
   //etc

};

配列リストにして Collections#sort を使用して独自のコンパレータを作成し、ソートされたマップ/ツリーマップを使用するまで、すべてを試しましたが、わかりません。ありがとう。

4

4 に答える 4

2

この関数を使用します。

static long comparedValue(String s) {
  return Long.valueOf(s.substring(0, s.indexOf(' ')));
}

次に、それに関して Comparator を定義します。

public int compare(String left, String right) {
  return comparedValue(left) - comparedValue(right);
}
于 2012-07-31T21:34:44.393 に答える
1

Googleグアバの使用:

List<String> unsorted = Arrays.asList(array);

Function<String, Long> longFunction = new Function<String, Long>() {
  @Override public Long apply(String input) {
    return Long.valueOf(input.split(" ")[0]);
  }
};

List<String> sorted = Ordering.natural().onResultOf(longFunction).immutableSortedCopy(unsorted);

または、リストを使用したくない場合 (常に配列よりもコレクションを優先する必要があります):

Arrays.sort(array, Ordering.natural().onResultOf(longFunction));
于 2012-07-31T21:35:35.377 に答える
0

カスタム コンパレータは正常に動作するはずです。

public class LongPrefixComparator implements Comparator<String> {
     @Override
     public int compare(String s1, String s2) {
         final long pref1 = getPrefixValue(s1);
         final long pref2 = getPrefixValue(s2);
         return s1 == s2 ? 0 : s1 < s2 ? -1 : 1;
     }

     private static long getPrefixValue(String stg) {
         int len = stg.indexOf(' ');
         if (len > 0) {
             try {
                 return Long.parseLong(stg.substring(0, len));
             catch (NumberFormatException ignored) {}
         }
         return 0L;
     }
}
于 2012-07-31T22:38:54.163 に答える
0

あなたが示した入力は完全にうまく機能します。しかし、それはそれらの桁数がすべて同じだからです。

public static void main(String[] args) {
    String[] array = { "2183417234 somerandomtexthere",
            "1234123656 somemorerandomtexthere", "1093241066 andevenmore",
            "1243981234 you get what i mean", "999 little shorter"
    // etc

    };

    List<String> list = Arrays.asList(array);
    Collections.sort(list);

    System.out.println(list);
}

上記の 999 のように、いくつかの短い数字を使用すると、問題が発生し始めます...

出力は次のようになります。

[1093241066 andevenmore, 1234123656 somemorerandomtexthere, 1243981234 you get what i mean, 2183417234 somerandomtexthere, 999 little shorter]

したがって、常に機能させるには、指定された文字列を分割し、それらから数値部分を取り出して比較できるカスタムコンパレータが必要です。@Marko Topolik ソリューションの使用:

static long comparedValue(String s) {
    return Long.valueOf(s.substring(0, s.indexOf(' ')));
}

public int compare(String left, String right) {

    long result = comparedValue(left) - comparedValue(right);

    boolean numberPartAreEqual = result == 0;
    if (numberPartAreEqual) {
        result = left.compareTo(right);
    }

    return (int) result;
}
于 2012-07-31T21:45:44.007 に答える