2016-04-19 16 views
1

私はソートされていませんList ... ArrayListには、複数の回の文字列が含まれています。非常に特定の文字列の出現を最初に並べ替えるにはどうしたらいいですか?残りのエントリは、指定された順序にとどまることができます。最初にカスタム文字列を並べ替えます

例えば、一番上にある必要があり、特定の文字列: 'JKL'

ソートされていない:{ DEF, ABC, JKL, GHI, ABC, DEF, JKL, MNO, GHI, ABC, MNO, JKL }

ソート:{ JKL, JKL, JKL, DEF, ABC, GHI, ABC, DEF, MNO, GHI, ABC, MNO }

任意の提案ですか? :)

答えて

1

Comparatorを使用しますが、コンパレータが一貫していることを確認してください。

public void test() { 
    List<String> strs = Arrays.asList(new String[]{"DEF", "ABC", "JKL", "GHI", "ABC", "DEF", "JKL", "MNO", "GHI", "ABC", "MNO", "JKL"}); 
    // All these are special and should appear at the front of the list. 
    Set<String> specials = new HashSet<>(Arrays.asList("ABC", "JKL")); 
    strs.sort((String o1, String o2) -> { 
     if (specials.contains(o1) == specials.contains(o2)) { 
      // Both special or both normal - just compare. 
      return o1.compareTo(o2); 
     } else if (specials.contains(o1)) { 
      // First is special! 
      return -1; 
     } else { 
      // Second is special. 
      return 1; 
     } 
    }); 
    System.out.println(strs); 
} 
+0

ねえ、これは非常にクールな解決策です:)。しかし、私はまだすべてのJKLをどのように並べ替えるべきかわからない。あなたの解決策の現在の出力は:[ABC、ABC、ABC、JKL、JKL、JKL、DEF、DEF、GHI、GHI、MNO、MNO] – Kody

+0

@Kody - 「スペシャル」から「ABC」を取り除くだけです。 – OldCurmudgeon

+0

それは素晴らしいです!ありがとうございました! :) – Kody

1

すべての​​要素をリストから削除することができます(最初の要素が​​である場合を除きます)。リストの先頭に新しい要素を追加してください。のは、あなたのリストがlistと呼ばれているとしましょう:

for(int i = 1; i < list.length(); i++) { //no need to check if the first element is "JKL" 
    if(list.get(i).equals("JKL")) { 
     list.remove(i); 
     list.add(0, "JKL"); 
    } 
} 

リストに追加する前にそれを削除していることを確認します。それ以外の場合は、list.remove(i+1);を実行する必要があります。

編集:他のオブジェクトを含むより一般的な解決方法は、削除したり再作成しないほうがよい一時的な変数に要素を格納してから、その要素をリスト:

for(int i = 1; i < list.length(); i++) { 
    if(list.get(i).equals("JKL")) { 
     String temp = list.get(i); 
     list.remove(i); 
     list.add(0, temp); 
    } 
} 
関連する問題