2017-11-15 18 views
1

私は現在、内部にあるものに基づいてデータを読み込んで出力する必要がある.txtファイルがあります。私は現在、ファイルを開いてファイルの各行をArrayListに保存しています。文字列の2番目の単語でArrayListをソート

.txtファイルはこのように設定されています。

  • 2380213012999 1508434343432ダビデが死ん
  • 4327482397488 7439857934858ジョン生き
  • 3857948998099 2222783749887マーティン・ケリー
  • 殺さ
  • 3857948998099 2222783749887ジョン・デビッド
殺さ

現在のコード。

{ 
    try { 
     File file = new File("input.txt"); 
     FileReader fileReader = new FileReader(file); 
     BufferedReader bufferedReader = new BufferedReader(fileReader); 
     StringBuffer stringBuffer = new StringBuffer(); 
     String line; 
     ArrayList<String> txtline = new ArrayList<String>(); 
     while ((line = bufferedReader.readLine()) != null) { 
      txtline.add(line); 
      System.out.println(txtline); 
     } 

     fileReader.close(); 
     System.out.println(stringBuffer.toString()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

} 

第二多数でテキストの各行をソートする方法があれば私は思ったんだけど、私が見てきたと私はちょうど何かを見つけるように見えることはできません。私がこれ以上進歩を遂げる前に、私がこれをやる必要があるので、私が現在困惑しているので、正しい方向の指針またはいくつかの指針はすばらしいでしょう。

+0

一つは、一般的に彼らの自然な順序(含む以外にオブジェクトをソートするために提供するために、 'Comparator'実装を定義します注文)。このような 'Comparator'のインスタンスを' Collections.sort() 'と一緒に使って' List'をソートすることができます。 –

+1

しかし、効率を上げるために、あらかじめソートキーを解析して、目的のために定義したクラスのオブジェクト内の対応する文字列の上にそれらを格納することをお勧めします。そして、それらを並べ替えます。 –

答えて

1

あなたはキーソートを定義し、ArrayListにそれを収集するためにsorted方法にComparatorオブジェクトを渡し、リストのストリームを作成することによって、手元の作業を行うことができます。

は数値的に比較する:

文字列で比較
txtline = txtline.stream() 
       .sorted(Comparator.comparingLong((String e) -> Long.parseLong(e.split(" ")[1])))        
       .collect(Collectors.toCollection(ArrayList::new)); 

を:彼らは自然を持っていない場合は

txtline = txtline.stream() 
       .sorted(Comparator.comparing((String e) -> e.split(" ")[1])) 
       .collect(Collectors.toCollection(ArrayList::new)); 
+0

これは大変感謝しています! - これはarraylistの各オブジェクトを分割し、それぞれを空白で配列に分割し、配列の2番目のオブジェクトをソートしますか?私がそれを完全に理解したいと思っていることを考えて正しいのですか?ありがとうbtw! – JorD

+0

@ JorD yupだから、基本的には各行の2番目の数字を '" "デリミタで分割し、2番目の要素を取り出して抽出したキーでソートします。また、あなたは答えを受け入れることで感謝することができます;-) –

1

あなたのwhileループの後にこれを入れて

java.util.Collections.sort(txtLine, new Comparator<String>() { 
    public void compare(String lineA, String lineB) { 
     String wordA2 = lineA.split(" ")[1]; 
     String wordB2 = lineB.split(" ")[1]; 
     return wordA2.compareTo(wordB2); 
    } 
}); 

は、より効率的に行うことができますが、(あなたがラムダを使用しない限り)のコードは、これよりもはるかに短い取得していません。

java.util.Collections.sort(txtLine, (String lineA, String lineB) -> { 
     String wordA2 = lineA.split(" ")[1]; 
     String wordB2 = lineB.split(" ")[1]; 
     return wordA2.compareTo(wordB2); 
}); 
+0

'txtLine.sort(Comparator.comparing(line - > line.split(" "[1])); ' – shmosel

+0

これは数値でソートされていなければ動作しません。 – shmosel

+0

@shmoselあなたはそうですが、問題のデータのフォーマットを見ても問題はないようです。 –

関連する問題