有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java操作和排序文本文件

我正在做一个项目,我得到了一个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) 个答案

  1. # 1 楼答案

    没有经过测试,但应该给你一些想法:

    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>

  2. # 2 楼答案

    1. 将文件加载到内存中

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

    1. 积累

    循环遍历arraylist并将团队得分累积到hashmap中。创建一张地图,通过将teamCode映射到totalScore来累积团队分数

    始终在自定义对象中为每一行存储行数据。通常,每列的字符串[]不是保存数据的好方法

  3. # 3 楼答案

    看看地图

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

    例如:

    Map<String,Integer> totalScore = new HashMap<>();
    
    if (totalScore.containsKey("COUNTRYNAME"))
        totalScore.put("COUNTRYNAME", totalScore.get("COUNTRYNAME") + playerScore)
    else
        totalScore.put("COUNTRYNAME",0)
    

    如果分数存在,这将添加到国家分数中,否则将为初始化为0的国家创建新的totalScore

  4. # 4 楼答案

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

    你的意思是:前3个字符是国家,看起来是正确的,但是你把信息设置为第4到第30个字符,这是不正确的。你需要动态地计算出结果和分数的开始。“info”和“stats”之间有一个空格,知道可以使用String的indexOf函数。(http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#indexOf(int)

  5. # 5 楼答案

    看看File Utils。之后,可以使用String Utilse删除<;br>;将其用作树形图的键。这样你就可以订购iTen了

    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
    

    当然,您需要调整代码段