找到每行的整数和字符串并将它们放入数组中?

Find both integers and strings for each line and put them in an array?

所以我有这个 dat 文件(txt 文件),其中每个国家/地区都有一个州和一个邮政编码。 在这个 dat 文件中,我有一个分号,用于分隔每行的字符串和每行的整数。为此,我还使用了一个接口和一个主 class,但这是应该完成大部分工作的 class。下面是方法。

PS:我试图在这个网站上找到其他问题,这些问题已经回答了我的问题,但没有一个真正帮助过我!

这是 dat 文件的内容:

75242;乌普萨拉

90325;于默奥

96133;博登

23642;Höllviken

35243;韦克舍

51000;延雪平

72211;韦斯特罗斯

我的问题是我找不到一种方法来按照我希望它们工作的方式将整数或字符串保存在数组中。曾尝试只读取整数和字符串,但这没有用。 另请注意,我已尝试读取每一行,然后读取 dat 文件中的每个字符,以尝试将值放入它们自己的数组中。 还尝试通过使用 if'ments 和说 "if(Character.is..)" 来移动它们。 在下面的方法中,我只是想捕获整数。

还认为由于分号,我应该使用 "Character.is...." 之类的东西来检查它,然后从读取 ch/string 转到 int。但是到时候要迈出一步,不然我什么都做不了!

public void read() {

    try {
        ArrayList<Integer> itemArr = new ArrayList<Integer>();
        ArrayList<String> descArr = new ArrayList<String>();
        FileReader file = new FileReader("C:\Users\me\Desktop\places.dat");
        BufferedReader r = new BufferedReader(file);
        int r1;

        while ((r.readLine()) != null) {
            while ((r1 = r.read()) != -1) {
                char ch = (char) r1;
                if (Character.isDigit(ch)) {
                    itemArr.add(r.read());
                }
            }
        }

    } catch (IOException e) {

    }
}

这是预期的: 它们也被排序,但我可以处理,只要我能弄清楚如何在它们自己的每个数组中正确存储。

23642 霍尔维肯

35243 韦克舍

51000 延雪平

72211 韦斯特罗斯

75242 乌普萨拉

90325 于默奥

96133博登

感谢所有评论,真的很有帮助。

您可以将您的逻辑更改为以下内容:

String currLine;
while ((currLine = r.readLine()) != null) {
    if (currLine.trim().length() > 0) {
        String[] split = currLine.split(";");
        itemArr.add(Integer.parseInt(split[0]));
        descArr.add(split[1]);
    }
}

这里我们根据;拆分每一行(currLine)并存入数组split。现在 0th 索引将包含数字,而 1st 索引将包含字符串。

要将其添加到 itemArr,您需要将其解析为 int。另请注意,如果该行为空,则会被跳过。现在排序也很简单。

你可以使用拆分功能,用“;”拆分因为 .dat 文件有;在邮政编码和字符串之间。如果你希望邮政编码是整数,你可以解析下面的部分[0]给你一个想法/

 FileReader file = new FileReader("C:\Users\me\Desktop\places.dat");
 BufferedReader r = new BufferedReader(file);

  String st;
  while ((st = br.readLine()) != null) {
   String[] parts = st.split[";"] 
   parts[0] // will have zipcode
   parts[1] // will have other part
  }

我建议您创建一个新的 class,例如存储号码和姓名的位置:

class NumberName {
    Integer number;
    String name;

    // constructor, setter, getter
}

然后从文件中读取时,将它们放在列表中:

FileReader file = new FileReader("C:\Users\me\Desktop\places.dat");
BufferedReader r = new BufferedReader(file);
String line;

List<NumberName> list = new ArrayList<>();
while ((line = r.readLine()) != null) {
    String[] split = line.split(";");
    list.add(new NumberName(Integer.parseInt(split[0]), split[1]));
}

然后排序就变得容易了:

list.sort(Comparator.comparingInt(NumberName::getNumber)); // by number
list.sort(Comparator.comparing(NumberName::getName)); // by name
list.sort(Comparator.comparing(NumberName::getNumber).thenComparing(NumberName::getName)); // by number then by name

使用两个列表是多余的。如果您知道每个邮政编码与每个国家相关,您应该创建对象来存储它们,然后将这些对象放入列表中。

public class MyLocation {
    private int zipcode;
    private String country;
    public MyLocation(int zipcode, String country) {
        this.zipcode = zipcode;
        this.country = country;
    }
    public int getZipcode() {
        return zipcode;
    }
    public String getCountry() {
        return country;
    }
}

此外,您有一个带分隔符的数据集,因此您应该利用它!使用 String.split() 并在该分号上拆分以获得一个数组,其中两个元素都已准备好提取。

ArrayList<MyLocation> locations = new ArrayList<>();
try {
    FileReader file = new FileReader("C:\Users\me\Desktop\places.dat");
    Bufferedreader r = new BufferedReader(file);
    try {
        String line;
        String[] lineValues;

        while ((line = r.readLine()) != null) {
            lineValues = line.split(";");
            MyLocation location = new MyLocation(Integer.valueOf(lineValues[0]), lineValues[1]);
            locations.add(location);
        } 
    } finally {
        r.close();
    }
} catch (IOException e) {
    e.printStackTrace();
}

此外,最好在使用完资源后将其关闭。我已经编辑了我的代码以演示执行此操作的一种方法。

正如其他人提到的,如果您想要排序,您还需要实施 Comparable,但这非常简单。