2017-01-24 9 views
0

私はこのようになります文字列を格納するArrayListありますソートArrayListのアルファベット順に値によって

  • アイテム1:一部のテキスト、アナベル
  • アイテム2:一部のテキスト、ジェームズ
  • ITEM3を:いくつかのテキスト、Conner

私はArrayListアルファベット順に各文字列のコンマの後の値でソートしたいと思います。

どうすればこの問題を解決できますか?

ArrayList<String> lineList = new ArrayList<>(); 

    // New BufferedReader. 
    BufferedReader reader = new BufferedReader(new FileReader(
      file)); 

    // Add all lines from file to ArrayList. 
    while (true) { 
     String line = reader.readLine(); 
     if (line == null) { 
      break; 
     } 
     lineList.add(line); 
    } 

    // Close it. 
    reader.close(); 

    // Print each line. 
    for (String line : lineList) { 
     System.out.println(line); 
    } 
+1

'CSV' あなたのファイルか?はいの場合は、カンマを "Some、text '、Annabelle"のような値の一部として含めることができるので注意が必要です。 –

+0

いいえ、それはtxtファイルですが、私は懸念を理解しています。ありがとう! – Nazrod12

+0

ファイルサイズが大きい場合は、ソート済みのリストをメモリ内でソートする代わりに作成すると便利です。私の答えを見てください。 –

答えて

1
import java.util.*; 

public class Test { 
    public static void main(String... args) { 
     List<String> list = new ArrayList<>(); 
     list.add("zzz, abc"); 
     list.add("yy, ghi"); 
     list.add("x, def"); 
     Collections.sort(list, new Comparator<String>() { 
      @Override 
      public int compare(String lhs, String rhs) { 
       return filter(lhs).compareTo(filter(rhs)); 
      } 

      private String filter(String s) { 
       // consider the first comma 
       return s.replaceFirst("^.*?, ", ""); 
       // to consider the last comma instead: 
       // return s.replaceFirst("^.*, ", ""); 
      } 
     }); 
     for (String s : list) 
      System.out.println(s); 
    } 
} 

出力は次のとおりです。

zzz, abc 
x, def 
yy, ghi 
5

Collections.sort()方法でComparatorを使用してください。例えば

Collections.sort(lineList, new Comparator<String>{ 
    public int compare(String str1, String str2) { 
     String actual1 = str1.split(",")[1]; 
     String actual2 = str2.split(",")[1]; 

     return actual1.compare(actual2); 
    } 
}); 

あなたがゼロまたは複数のカンマがある場合には、あなたが実際に、文字列の正しい部分を抽出することを確保するためのいくつかの方法がよいでしょう。たとえば、substring()lastIndexOf()と組み合わせて、IQVを使用することができます。

+2

"あなたは何らかの方法で確実にすることができます..."、または唯一のカンマが最後にある場合は、 'Foo、'。 –

0

jesperと同じように、コンパレータが必要です。このComparatorでは、fornameをメソッドlastIndexOf(',')で識別します。

1

これは、Java 8を使用して1つのライナーです:

lineList.sort((String s1, String s2) -> s1.split(",")[1].compareTo(s2.split(",")[1])); 
1

場で並べ替え、その移入後にリストをソートしないでください。

public static void main(String[] args) throws IOException { 
     Set<String> lines = new TreeSet<>(Comparator.comparing(o -> o.substring(o.indexOf(',')))); 

     // New BufferedReader. 
     BufferedReader reader = new BufferedReader(new FileReader("sample.txt")); 

     // Add all lines from file to ArrayList. 
     while (true) { 
      String line = reader.readLine(); 
      if (line == null) { 
       break; 
      } 
      lines.add(line); 
     } 

     // Close it. 
     reader.close(); 

     // Print each line. 
     for (String line : lines) { 
      System.out.println(line); 
     } 
    } 
1

Javaを使用したワンライナーのバリエーション8:

Collections.sort(list, Comparator.comparing(s -> s.substring(s.lastIndexOf(","), s.length()))); 

または短い

list.sort(Comparator.comparing(s -> s.substring(s.lastIndexOf(","), s.length()))); 
関連する問題