0

Persons.txt と Hobby.txt の 2 つのファイルがあります。3 番目のファイルには、すべての人物の名前を入力し、それぞれの名前に趣味を追加します。

ID;NUME;PRENUME;DATA_NASTERII;PROFESIA
1;Stan;Ilie;22-01-1977;profesor;
2;Becali;GG;01-07-1965;patron;
3;Tanase;Cristian;07-12-1988;fotbalist;
4;Pop;Ion;21-03-1984;pictor;
5;Popescu;Rodica;17-04-1986;sculptor;

ホビー.txt

ID;NUME;DESCRIERE;NUMAR_MINIM_PERSOANE;ELEMENT_NECESAR
1;baschet;sport in care se arunca mingea la cos;6;minge
2;fotbal;sport in care nue voie sa atingi mingea in poarta adversa;14;minge
3;chitara;cantatul la chitara;1;chitara
4;pianul; cantatul la pian;1;pian
5;programarea;scrierea de programe software;1;PC

次のような 3 番目のファイルが必要です。

Ion Pop : baschet, volei
Ilie Stan: steaua, handbal

問題は私が知らないことだ

  • 人の名前を取得する方法と
  • それらに2つまたは3つの趣味を追加する方法。
  • ファイルから各行を分割して 3 番目のファイルに書き込む方法

私のコード

   import java.io.*;
   import java.util.*;
   import java.util.ArrayList;

   public class ListaHobby {
             String line="";
             Persoana p = new Persoana();
             Hobby h = new Hobby();
             public void writeListaHobbies(){
               try{
                     FileReader file1 =new FileReader("Persoane.txt");
                     Scanner scan = new Scanner(new File("Persoane.txt"));
                     ArrayList<String> values = new ArrayList<String>();
                     System.out.println(values.size());

                     FileReader file2 = new FileReader("Hobby.txt");
                     scan = new Scanner(new File("Hobby.txt"));
                     values = new ArrayList<String>();
                     System.out.println(values.size());

                     while(scan.hasNext()){
                               values.add(scan.next());
                     }

                      BufferedReader br1 = new BufferedReader(file1);
                      BufferedReader br2 = new BufferedReader(file2);

                      String temp1="";
                      String temp2="";

                      while(br1.readLine() != null){
                        temp1 = br1.readLine() + temp1;
                      }
                      while(br2.readLine() != null){
                            temp2 = br2.readLine() + temp2;
                      }

                      String temp = temp1 + temp2;

                       FileWriter fw = new FileWriter("PersHobby.txt");
                       char buffer[] = new char[temp.length()];
                       temp.getChars(0, temp.length(), buffer, 0);
                       fw.write(buffer);
                       file1.close();
                       file2.close();
                       fw.close();
                    }
                    catch(IOException ex){
                           System.out.println("Error opening file.");
                           System.exit(1);
                    }`
4

2 に答える 2

3

オブジェクト指向の観点からそれを見てみてください。あなたは反対しなければなりません。オブジェクトとオブジェクトのPersonようなHobbyもの。ファイルの各行は、そのようなオブジェクトの1つを表します。ここで行うべきことは、ファイルを解析するのと同じように解析することですが、その情報を使用してオブジェクトを作成します。これがファイル1のリーダーであるとするとbr1、次のようになります。

while(br1.readLine() != null){

    String line = br1.readLine();           // read the line
    String[] attributes = line.split(";");  // split it at every ";"

    Person person = new Person();           // make a new person
    person.setName(attributes[0]);          
    person.setSurname(attributes[1]);
    person.setDate(attributes[2]);
    person.setProfession(attributes[3]);

    listOfPersons.add(person);               // store the person in a list
}

もちろん、PersonクラスとHobbyクラスを作成する必要があります。

その後、リストを繰り返して、人の趣味を検索できます。見つけた場合は、その人に追加します。

for(Person person: listOfPersons) {

    for(Hobby hobby: listOfHobbies) {

        if(person.getId().equals(hobby.getPerson()))
            person.addHobby(hobby);
     }
 }

その後、趣味の人のリストがあります。これをファイルに再度書き込むことができます。このアプローチにはもう少しコードが必要ですが、ほとんどは単純なコードです。そして、あなたはそれをきれいな方法で行います。

編集:

Personクラスは次のようになります。

パブリッククラスPerson{

private int id;
private String name;
private String surname;
private String date;
private String profession;

private List<Hobby> hobbies = new ArrayList<Hobby>();

// getter & setter for all this attributes

// here is the one to add hobbies:
public void addHobby(Hobby hobby) {

    hobbies.add(hobby);
}
}
于 2012-05-02T10:05:17.383 に答える
0

質問で定義したようにファイルPersHobby.txtを生成するには、次のアクションを実行する必要があります

  • 個人リストから名前を読む
  • 趣味リストから趣味を読む
  • リスト内の各人に対してループを実行します
  • ループを実行して、趣味のランダムな選択を生成します
  • 現在の人と上の趣味のようなラインを作成します
  • 上記の行をPersHobbyに書き込みます

上記のアルゴリズムは非常に暫定的なものです。

各ファイルの構造は類似している(セミコロンで区切られている)ため、関連するフィールドだけを次のように読み取ることができます。

private static List<String> readFieldFromFile(List<String> values, String delimiter, int index) {

    if (values != null && values.size() > 0) {

        List<String> returnable = new ArrayList<String>(values.size());
        // proceed only if the list of values is non-empty
        Iterator<String> it = values.iterator();
        // instantiate an iterator
        while (it.hasNext()) {
            // iterate over each line
            String currLine = it.next();
            if (currLine != null && currLine.trim().length() > 0) {
                // split the line into it's constituent fields if the line is not empty
                String[] fields = currLine.split(delimiter);
                if (fields.length - index > 0) // Read the particular field, and store it into the returnable
                {
                    returnable.add(fields[index - 1]);
                }
            }
        }
        return returnable;
    } else {
        return null;
    }
}

public static List<String> readName(List<String> persons) {
// name occurs at the second position in the line
    return readFieldFromFile(persons, ";", 2);
}

public static List<String> readHobby(List<String> hobbies) {
// name of hobby occurs at the second position in the line
    return readFieldFromFile(hobbies, ";", 2);
}

次に、人の趣味の文字列を生成する必要があります..以下の方法のようなものです。この方法では、投げられた趣味のコレクションからランダムに2つの趣味を取り出します。

public static String generateRandomHobbies(List<String> hobbies){
    String hobbieString = "";
    // Read two hobbies at random from the hobbies list into a comma-separated string
    if(hobbies.size() >= 2){
        Random rand = new Random();
        hobbieString.concat( hobbies.get((int)(hobbies.size()*rand.nextFloat())) );
        hobbieString.concat( ", " );
        hobbieString.concat( hobbies.get((int)(hobbies.size()*rand.nextFloat())) );
        hobbieString.concat( ", " );
    }
    return hobbieString;
}   

うまくいけば、これで十分であることがわかります。文字列のフォーマットはそのままにして、実際に出力ファイルに書き込みます。

psオブジェクトが再初期化されるため、スキャナーを使用するための既存のコードに問題があります。この再初期化により、アプリケーションにはHobbyファイルの内容のみが残ります。

while(scan.hasNext()){
    values.add(scan.next());
}

この問題を修正して、各ファイルのコンテンツが個別のリストに含まれるようにしてください。

于 2012-05-03T20:15:59.210 に答える