【问题标题】:Sorted text file array missing words (Java)排序的文本文件数组缺少单词(Java)
【发布时间】:2021-07-01 00:48:54
【问题描述】:

所以我正在编写一些代码,该代码采用未排序的文件,并按字母顺序仅在新文件中写出游戏名称。

这是原始文件的样子:

04/26/16    Sega 3D Classics Collection
07/14/16    Batman: Arkham Underworld
06/24/16    Tokyo Mirage Sessions #FE

这是新文件的所需内容

Batman: Arkham Underworld
Sega 3D Classics Collection 
Tokyo Mirage Sessions #FE

我的代码由于某种原因取出第一个单词并对其进行排序的问题。 (例如,而不是 Batman: Arkham Underworld 它将是 Arkahm Underworld )。我尝试的是从 indexOf(" ") 和我的方法的 info.length 中减去 1,但这似乎不起作用。我确信该方法和文件的写入工作但第一个单词丢失广告将使用没有第一个单词的字符串排序。我不太确定这段代码的问题出在哪里

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
    
public class Main {
    public static void main(String[] args) throws IOException {
        File file = new File("releasedates.txt");

        String[] arr = input(file);

        sortByName(arr);
    }

  public static String[]input (File file) throws FileNotFoundException{
    String[]arr = new String[3];
    Scanner sc = new Scanner(file);

    for(int i = 0; i < arr.length; i++){
      arr[i] = sc.nextLine();

    }
    return arr;
  }


    public static void sortByName(String[] info) throws IOException {
        String[] names = new String[3];

        for (int i = 0; i < info.length; i++) {
            names[i] = info[i].substring(info[i].indexOf(" "), info[i].length());
        }

        String temp;

        for (int j = 0; j < names.length; j++) {
            for (int i = j + 1; i < names.length; i++) {

                if (names[i].compareTo(names[j]) < 0) {
                    temp = names[j];
                    names[j] = names[i];
                    names[i] = temp;
                }
            }
        }

        FileWriter writer = new FileWriter("SortedByName.txt");
        for (String aString : names) {
            writer.write(aString);
        }
        writer.close();
    }

}

【问题讨论】:

  • 日期和标题之间的“空格”...是多个空格还是一个制表符0x09 字符?这将完全解释您所看到的行为。
  • @JimGarrison 日期和名称之间的间距是制表符间距
  • 那么,您正在寻找一个空格字符并直接跳过制表符到第一个“真实”空格 (0x20) 字符。如果您可以保证它始终是一个选项卡,请更改 indexOf 参数。如果没有,请改用split(regex,limit)(限制为 2)。

标签: java loops file input methods


【解决方案1】:

数据在日期和标题之间有一个制表符,而您的 indexOf() 正在寻找一个空格,因此您直接跳过制表符和标题的第一个单词到第一个“真实”空格。

改为使用

names[i] = (info[i].split("\\s+",2))[1];

这会将字符串拆分为一个或多个空白字符(包括制表符)的第一个字符串,将输出限制为 2 个结果,并且[1] 选择返回数组的第二个元素,该元素将包含标题。

这适用于空格和制表符。

【讨论】:

  • 感谢您的回答!但是我有一个问题,一旦将其写入新文件中,如何使其显示每个名称是每一行?因为现在它显示为一行。我想打破每个名字之间的界限
  • 在每一行的末尾输出一个换行符("\n")。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多