0

テキストファイルから読み取った要素を分割して、Javaで別々の配列に書き込もうとしています。INPUTは次のようなものです:

ID、ParentID、Name

4,17、abc

1,0、def

17,0、ghi

9,17、klm

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

ghi、17

klm、9

abc、4

def、1

IDに基づいて降順で並べ替える必要があります。私はそれを行う最も効率的な方法はクイックソートだと思います(私はこれを行う考えを持っています)。私の質問は、テキストファイルのすべての要素を分割しましたが、id、parentid、およびnameに個別の配列を作成することができません。それらが配列に分割され、IDがソートされた後、idは対応する名前を付ける必要があります。誰かが配列部分への書き込みを手伝ってくれませんか?前もって感謝します。

私はこれまで行ってきました:

import java.io.*;

public class Folder {
/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
        FileInputStream fstream = new FileInputStream("input.txt");
        // Get the object of DataInputStream
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String strLine;         
        //Read File Line By Line
        while ((strLine = br.readLine()) != null)   {
            // Print the content on the console
            String[] a=strLine.split(",",3);
            String id=a[0];
            String parentid=a[1];
            String name=a[2];
            for(int i=0;i<3;i++) {
                System.out.println(a[i]);
            }
            //System.out.println (strLine);
        }
        //Close the input stream
        in.close();
        //Catch exception if any
        } 
        catch (Exception e) {
            System.err.println("Error: " + e.getMessage());
        }
    }
}

これにより、テキストファイルのすべての要素が分割されます。

4

2 に答える 2

0

あなたはそれを難し​​い方法でやっています。

ここにいくつかのアドバイスがあります:

  • プリミティブ型と配列からデータ構造を構築しないでください。Java にはコレクション型 (リスト、マップなど) があり、カスタム型を作成できます。

  • 2 次元データ構造があり、主な要件が行の並べ替えである場合は、列を主構造にしないでください。つまり、行の配列/リストがある場合、列の配列よりも行でソートする方が簡単です。

  • Java ライブラリには、ソートの標準的な (効率的な) 実装があります。カスタム クラス (または配列) を並べ替え可能にするには、クラスを実装として宣言するかComparable<TheClass>、区切りComparator<TheClass>オブジェクトを作成する必要があります。

  • javadoc を使用して、標準ライブラリで何が利用できるかを理解してください。

于 2013-01-27T05:05:38.103 に答える
0

いくつかのことを試すことができます。あなたの例を見ると、 aMapを使用して id をキーとして使用し、他の入力のリストを作成したくなるでしょう。たとえばMap<Integer,List<String>>、これはおそらくあなたの例ではやり過ぎです。

Object新しいものを作ることもできます

public Input implements Comparable<Input>{
    private int id;
    private int parentId;
    private String name;

    public Input(int a, int b, String c){
        //set params}
    }

    @Override
    public int compareTo(Input o){
        Input input = (Input) o;
        return this.id - input.getId();
    }
}

読み取らなければならない行数がわかっている場合は配列を作成できますが、そうでない場合はコレクションを使用して動的に大きくなります。

List<Input> inputList = new ArrayList<Input>();
while ((strLine = br.readLine()) != null){
     String[] a=strLine.split(",",3);
     inputList.add(new Input(a[0],a[1],a[2]));
     ....
}

次に、ID と出力でソートする必要があります。

Input実装Comparable( javadoc ) を使用して並べ替えることができるようになったので( javadocは、重複を処理する方法を説明しています)、リストを反復して出力するだけです。Collections.sort(inputList)

于 2013-01-27T03:48:38.470 に答える