【问题标题】:Reading and grouping uncertain sized arrays in Java在 Java 中读取和分组不确定大小的数组
【发布时间】:2020-09-10 05:18:46
【问题描述】:

我有一个文件,上面有一些字符串。此文件中的每个组都有两个 ID,我想我可以将这些组与这些 ID 行所在的位置分开。我创建了一个方法来检查字符串是否以数字字符开头。然后我将这些字符串的索引号保存在 @ 987654321@.

现在我想从这些数据中创建具有这些 ID 的对象,以及一个包含这些字符串组的数组列表。 示例文件格式:

1   4
str1
str2
2   11
str3
str4
str5
5   7
str6
str7
str8
7   90
str9

我试图让它工作的代码

    @Override
    public void readFile(String path) {
        try {
            Scanner scanner = new Scanner(new File(path));
            ArrayList<String> temporaryArray = new ArrayList<>();
            ArrayList<Integer> integers = new ArrayList<>();
            while (scanner.hasNextLine()) {
                temporaryArray.add(scanner.nextLine());
            }
            for (String string : temporaryArray) {
                if (ifExistOnArray(string.charAt(0))) {
                    integers.add(temporaryArray.indexOf(string));
                }
            }
            for (int i = 0; i < integers.size(); i++) {
                String[] numline = temporaryArray.get(integers.get(i)).split("\t");
                int firstID = Integer.parseInt(numline[0]);
                int secondID = Integer.parseInt(numline[1]);
                ArrayList<String> objectLines = new ArrayList<>();
                for (int j = integers.get(i); j < integers.get(i+1) - 1; j++) {
                    objectLines.add(temporaryArray.get(j+1));
                }
                Admission admission = new Admission(firstID, secondID, objectLines);
                IOOperations.admissionArrayList.add(admission);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }

以及我用于检查行是否以数字开头的方法。

public boolean ifExistOnArray(char ch) {
        char[] chars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
        boolean found = false;
        for (char iterate : chars) {
            if(ch == iterate) {
                found = true;
                break;
            }
        }
        return found;
    }

代码在for (int j = integers.get(i); j &lt; integers.get(i+1); j++) { 行中给出了IndexOutOfBoundsException,我理解它为什么这样做,但我想不出任何解决方案来使它工作。我应该怎么做才能使这段代码工作?

【问题讨论】:

  • user19281 - 有更新吗?
  • @ArvindKumarAvinash 您好,感谢您的回答。在我最初的想法中,整数数组将存储以数字开头的行的索引。并且temporaryArray 将存储所有行,并且在循环中我将操作对象的创建,但是在看到Christian Bongiorno 的回答后,我认为使用LinkedHashMap 可能是一个更好的主意。但是感谢您指出使用 \\s+ 和 isDigit 我现在正在使用它们。

标签: java oop arraylist


【解决方案1】:

我非常努力地想在 Java 中提出一种函数式方法,但我不知道有一种函数式方法不会让我填补 Java 函数世界中的空白并实际编写更多代码。所以,这里是命令式的方法:

BufferedReader file = new BufferedReader(new InputStreamReader(new FileInputStream("sample.txt")));

Map<String,List<String>> result = new LinkedHashMap<>();
String lastKey = null;

for(String line = file.readLine(); line != null; line = file.readLine()){
    if(line.matches("\\d+[ ]+\\d+")){
        lastKey = line;
    }
    else{
        result.computeIfAbsent(lastKey,k -> new ArrayList<>()).add(line);
    }
}
result.forEach((k,v) -> System.out.format("(%s) -> %s%n",k,v));

产量:

(1   4) -> [str1, str2]
(2   11) -> [str3, str4, str5]
(5   7) -> [str6, str7, str8]
(7   90) -> [str9]

【讨论】:

    【解决方案2】:

    解决以下几点:

    1. 你不需要下面的代码

      public boolean ifExistOnArray(char ch) {
          char[] chars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
          boolean found = false;
          for (char iterate : chars) {
              if(ch == iterate) {
                  found = true;
                  break;
              }
          }
          return found;
      }
      

      您可以改用Character.isDigit(ch),例如Character.isDigit('4') 将返回 true

    2. \\s+ 而不是\t 上拆分。

    3. 以下循环对我来说没有意义。 temporaryArray 中的值与integers 中的值有什么关系?

      for (int j = integers.get(i); j < integers.get(i+1) - 1; j++) {
          objectLines.add(temporaryArray.get(j+1));
      }
      

      不管怎样,如果您使用temporaryArray.get(j+1),则循环条件必须检查您试图从中获取值的temporaryArray 的索引,即它应该是

      for (int j = integers.get(i); j < temporaryArray.size() - 1 && j < integers.get(i+1) - 1; j++)
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 2011-03-15
      相关资源
      最近更新 更多