操纵和排序文本文件

时间:2014-10-10 15:32:08

标签: java arrays sorting text

我正在开展一个项目,我获得了text file,我必须为每个团队加分,并打印前5名团队。

文本文件如下所示:

FRAMae Berenice MEITE         455.455<br>
CHNKexin ZHANG                454.584<br>
UKRNatalia POPOVA             453.443<br>
GERNathalie WEINZIERL         452.162<br>
RUSEvgeny PLYUSHCHENKO        191.399<br>
CANPatrick CHAN               189.718<br>
CHNHan YAN                    185.527<br>
CHNCheng & Hao                271.018<br>
ITAStefania & Ondrej          270.317<br>
USAMarissa & Simon            264.256<br>
GERMaylin & Daniel            260.825<br>
FRAFlorent AMODIO             179.936<br>
GERPeter LIEBERS              179.615<br>
JPNYuzuru HANYU               197.9810<br>
USAJeremy ABBOTT              165.654<br>
UKRYakov GODOROZHA            160.513<br>
GBRMatthew PARR               157.402<br>
ITAPaul Bonifacio PARKINSON   153.941<br>
RUSTatiana & Maxim            283.7910<br>
CANMeagan & Eric              273.109<br>
FRAVanessa & Morgan           257.454<br>
JPNNarumi & Ryuichi           246.563<br>
JPNCathy & Chris              352.003<br>
UKRSiobhan & Dmitri           349.192<br>
CHNXintong &Xun               347.881<br>
RUSYulia LIPNITSKAYA          472.9010<br>
ITACarolina KOSTNER           470.849<br>
JPNMao ASADA                  464.078<br>
UKRJulia & Yuri               246.342<br>
GBRStacey & David             244.701<br>
USAMeryl &Charlie             375.9810<br>
CANTessa & Scott              372.989<br>
RUSEkaterina & Dmitri         370.278<br>
FRANathalie & Fabian          369.157<br>
ITAAnna & Luca                364.926<br>
GERNelli & Alexander          358.045<br>
GBRPenny & Nicholas           352.934<br>
USAAshley WAGNER              463.107<br>
CANKaetlyn OSMOND             462.546<br>
GBRJenna MCCORKELL            450.091<br>

前三个字母代表团队。
文本的其余部分是竞争对手的名字 最后一位数是竞争对手获得的分数。

到目前为止

代码:

import java.util.Arrays;

public class project2 {

  public static void main(String[] args) {
    // TODO Auto-generated method stub

    String[] array = new String[41];
    String[] info = new String[41];
    String[] stats = new String[41];
    String[] team = new String[41];

    //.txt file location

    FileInput fileIn = new FileInput();
    fileIn.openFile("C:\\Users\\O\\Desktop\\turn in\\team.txt");

    // txt file to array
    int i = 0;
    String line = fileIn.readLine();
    array[i] = line;
    i++;
    while (line != null) {

      line = fileIn.readLine();
      array[i] = line;
      i++;
    }

    //Splitting up Info/team/score into seprate arrays

    for (int j = 0; j < 40; j++) {
      team[j] = array[j].substring(0, 3).trim();
      info[j] = array[j].substring(3, 30).trim();
      stats[j] = array[j].substring(36).trim();
    }


    // Random stuff i have been trying  
    System.out.println(team[1]);
    System.out.println(info[1]);
    System.out.println(stats[1]);
    MyObject ob = new MyObject();
    ob.setText(info[0]);
    ob.setNumber(7, 23);
    ob.setNumber(3, 456);
    System.out.println("Text is " + ob.getText() + " and number 3 is " + ob.getNumber(7));
  }
}

我现在几乎陷入困境,因为我不确定如何将每支球队的得分加在一起。

5 个答案:

答案 0 :(得分:0)

这看起来像家庭作业......首先,您需要检查如何解析文件中的字符串。

你说的是:前3个字符是国家,看起来是正确的,但是你将信息设置为第4到第30个字符,这是不正确的。您需要动态地找出结束的位置并开始分数。 &#34; info&#34;之间有一个空格。以及&#34;统计数据,&#34;知道你可以使用String的indexOf函数。 (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#indexOf(int)

答案 1 :(得分:0)

看看地图。

地图是一个集合,允许您在很短的时间内获取与密钥相关的数据。 您可以创建一个地图,其中键是国家/地区名称,其值为总点数。

示例:

Map<String,Integer> totalScore = new HashMap<>();

if (totalScore.containsKey("COUNTRYNAME"))
    totalScore.put("COUNTRYNAME", totalScore.get("COUNTRYNAME") + playerScore)
else
    totalScore.put("COUNTRYNAME",0)

如果分数存在,这将添加到国家/地区分数,否则将为初始化为0的国家/地区创建新的总分数。

答案 2 :(得分:0)

未经测试,但应该给你一些想法:

public static void main(String... args)
        throws Exception {

    class Structure implements Comparable<Structure> {
        private String team;

        private String name;

        private Double score;

        public Structure(String team, String name, Double score) {
            this.team = team;
            this.name = name;
            this.score = score;
        }

        public String getTeam() {
            return team;
        }

        public String getName() {
            return name;
        }

        public Double getScore() {
            return score;
        }

        @Override
        public int compareTo(Structure o) {
            return this.score.compareTo(o.score);
        }
    }


    File file = new File("path to your file");
    List<String> lines = Files.readAllLines(Paths.get(file.toURI()), StandardCharsets.UTF_8);
    Pattern p = Pattern.compile("(\\d+(?:\\.\\d+))");

    List<Structure> structures = new ArrayList<Structure>();
    for (String line : lines) {

        Matcher m = p.matcher(line);
        while (m.find()) {
            String number = m.group(1);
            String text = line.substring(0, line.indexOf(number) - 1);
            double d = Double.parseDouble(number);

            String team = text.substring(0, 3);
            String name = text.substring(3, text.length());

            structures.add(new Structure(team, name, d));
        }
    }

    Collections.sort(structures);
    List<Structure> topFive = structures.subList(0, 5);

    for (Structure structure : topFive) {
        System.out.println("Team: " + structure.getTeam());
        System.out.println("Name: " + structure.getName());
        System.out.println("Score: " + structure.getScore());
    }
}

只需从文件中删除<br>即可。

答案 3 :(得分:0)

  1. 将文件加载到内存
  2. 你的字符串拆分逻辑看起来很好。 创建一个类似PlayerData的类。为每一行创建该类的一个实例,并使用setter将所有三个字段设置为该类。 继续将PlayerData对象添加到数组列表中。

    1. 累积
    2. 循环遍历arraylist并将团队分数累积到hashmap中。通过将teamCode映射到totalScore来创建Map以累积团队分数。

      始终将行数据存储在每行的自定义对象中。每列的String []通常不是保存数据的好方法。

答案 4 :(得分:0)

看看File Utils。之后,您可以使用String Utils从最后一个空格字符中提取内容,然后删除&lt; br&gt;使用它作为TreeMap的关键。你可以订购你的itens。

List<String> lines = FileUtils.readLines(yourFile);
Map<String, String> ordered = new TreeMap<>();

for (String s : lines) {
  String[] split = s.split(" ");
  String name = split[0].trim();
  String rate = splt[1].trim().substring(0, key.length - 4);
  ordered.put(rate, name);
}

Collection<String> rates = ordered.values(); //names ordered by rate

当然,您需要调整代码段。