Kym
Kym

Reputation: 13

Data evaluation from text file

I need some help. I dont know how to solve my problem. I have text file in this format:

personx 25
personz 2  
persony 5  
persony 7  
personi 55  
personx 25

I need to count the numbers for every person. The output should be "personx = 50" etc.
I can not use my old system where I knew there is 10 people. So I had 10 variables and I just went through the file with scanner and checked if line starts with "personx" then count the number to variable personx etc. I dont want to use these variables now. I dont want to change code after every new person.
How to solve this? I want to have this output sorted from highest to lowest:

personi = 55
personx = 50
persony = 12
personz = 2

Is that possible without using variables

personi, personx, persony, personz ?
My idea was to go through the file and scan the names. Save the name into an array and add another name into an array if that name is not in the array yet. So I will have the names.
Next I will scan the file again and check for the name and number. Check name + number and then save the number into another array on the same possition as the name in the first array. So I will have

Names[0] = "personi";
Count[0] = 55;
Names[1] = "personx";
Count[1] = 50;

And then I will just print these two arrays with for cycle.

I dont think that it is the best solution. How would you do it? Is there something better/faster/easier ? And how to solve that Sorting?
Thank you for your time.

Upvotes: 1

Views: 76

Answers (1)

Aleksandar Đokić
Aleksandar Đokić

Reputation: 2333

You can us Map<String,Integer>

In this case i used TreeMap which will sort everything for you. If you dont need sorting then just use HashMap instead of TreeMap.

Map<String, Integer> map = new TreeMap();
  try {
      BufferedReader reader = new BufferedReader(new FileReader(new File("C:/iPhone/persons.txt")));
      String line = "";
      String [] person = new String[2];
      while ((line = reader.readLine()) != null) {
          person = line.split(" ");
          String name = person[0];
          int number = Integer.parseInt(person[1]);
          map.put(name,map.getOrDefault(name,0)+number);
      }
      reader.close();
  } catch (IOException ioe) {
      ioe.printStackTrace();
  }
  map.forEach((k,v)->System.out.println(k + " = " + v));

}

persons.txt:

personx 25
personz 2  
persony 5  
persony 7  
personi 55  
personx 25

Output:

personi = 55
personx = 50
persony = 12
personz = 2

1) Can I use this on file where line is not in my format but it has for example.. this format ? "personx bla bla 25" ? Is it possible to convert it too? how?

Yes you can create method which will do it for you. You can use either string splits or some regex.

2) Why is there String [] person = new String[2]; ?

Mistake, it should be String[1]. Corrected now

3) what is String line = ""; ?

It is just new String where i'm storing every line that i read from file. As you can see, im assigning reder.readLine() in while loop. After that im just splitting it.

EDIT: Changed code so person can have multiple params but will take only first as name and last as number.

public static void main(String[] args) {
        Map<String, Integer> map = new TreeMap();
          try {
              BufferedReader reader = new BufferedReader(new FileReader(new File("C:/iPhone/persons.txt")));
              String line = "";
              String [] person;
              while ((line = reader.readLine()) != null) {
                  person = line.split(" ");
                  String name = person[0];
                  int number = Integer.parseInt(person[person.length-1]);
                  map.put(name,map.getOrDefault(name,0)+number);
              }
              reader.close();
          } catch (IOException ioe) {
              ioe.printStackTrace();
          }
          map.forEach((k,v)->System.out.println(k + " = " + v));
        }

persons.txt:

personx  asdasdas dasd asd a 25
personz 2  
persony asd asd asd a 5  
persony 7  
personi 55  
personx 25

output:

personi = 55
personx = 50
persony = 12
personz = 2

Upvotes: 2

Related Questions