【问题标题】:Data evaluation from text file来自文本文件的数据评估
【发布时间】:2016-08-10 00:43:14
【问题描述】:

我需要一些帮助。我不知道如何解决我的问题。 我有这种格式的文本文件:

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

我需要计算每个人的数字。输出应为“personx = 50”等。
我不能使用我知道有 10 个人的旧系统。所以我有 10 个变量,我只是用扫描仪检查文件并检查行是否以“personx”开头,然后将数字计数到变量 personx 等。我现在不想使用这些变量。我不想在每个新人之后更改代码。
如何解决这个问题?我想让这个输出从高到低排序:

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

不使用变量是否可行

personi, personx, persony, personz ?
我的想法是浏览文件并扫描名称。将名称保存到数组中,如果该名称尚未在数组中,则将另一个名称添加到数组中。所以我会有名字。
接下来我将再次扫描文件并检查名称和编号。检查名称+数字,然后将数字保存到另一个数组中,与第一个数组中的名称相同。所以我会有
Names[0] = "personi";
Count[0] = 55;
Names[1] = "personx";
Count[1] = 50;

然后我将使用 for 循环打印这两个数组。

我不认为这是最好的解决方案。你会怎么做?有没有更好/更快/更容易的东西?以及如何解决该排序问题?
感谢您的时间。

【问题讨论】:

  • 使用Map<String, Integer>

标签: java arrays file sorting text


【解决方案1】:

您可以联系我们Map<String,Integer>

在这种情况下,我使用了TreeMap,它将为您排序所有内容。如果您不需要排序,则只需使用HashMap 而不是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

输出:

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

1) 我可以在行不是我的格式但它有例如..这种格式的文件上使用它吗? “personx bla bla 25”?也可以转换吗?怎么样?

是的,您可以创建为您执行此操作的方法。您可以使用字符串拆分或一些正则表达式。

2) 为什么会有String[] person = new String[2]; ?

错了,应该是String[1]。现已更正

3) 什么是字符串 line = ""; ?

这只是新的String,我存储从文件中读取的每一行。如您所见,我在 while 循环中分配了reder.readLine()。之后我只是拆分它。

编辑: 更改了代码,因此人可以有多个参数,但只会将名字作为名字,将最后作为数字。

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

输出:

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

【讨论】:

  • 您好,感谢您的回复!那帮助很大! :) 我有几个问题.. 1)我可以在文件中使用它,其中行不是我的格式,但它有例如..这种格式? “personx bla bla 25”?也可以转换吗?如何? 2)为什么会有String[] person = new String[2]; ?为什么不 String [] person = new String[1]; ? 3) 什么是 String line = ""; ? :)
  • @Kym 答案已编辑,请立即查看。让我知道,例如,如果输入是“personx bla bla bla 25”,应该输出什么? “personx 25”还是“personx bla bla bla 25”?
  • 感谢您的回答! :) 输出应该是“personx 25”
  • 为了让我的问题更具体.. - 如何使用文本输入“personx bla bla 25”实现相同的输出?
  • 已编辑。你现在可以试试:)
猜你喜欢
  • 2019-03-21
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多