0

我有两个文件 Persons.txt 和 Hobby.txt。在第三个文件中我想把所有的人的名字和每个名字添加一些爱好。这就是我的文件看起来像 Persons.txt

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

我需要第三个文件,如下所示:

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

问题是我不知道

  • 如何获取人名和
  • 如何给他们添加 2 或 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物体的东西。文件的每一行都代表一个这样的对象。您现在应该做的是像您一样解析文件,但使用信息创建对象。假设这br1是文件 1 的阅读器,它可能如下所示:

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 类可能如下所示:

公共类人{

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);
}

接下来我们需要为一个人的爱好生成一个字符串......类似于下面的方法。这种方法从扔给它的爱好集合中随机抽取两个爱好。

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 回答