【问题标题】:Append Line if Line Contains Character如果行包含字符,则追加行
【发布时间】:2013-07-08 14:20:46
【问题描述】:

我正在尝试编写一个程序来读取文本文件并将文本文件中的一行(例如 B 行)附加到上一行 A 行,如果 B 行包含字符串“&”。这是我的代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
public class Inputs {
    public static void main(String[] args) {
        File file = new File("C:\\Users\\frencke\\workspace\\Testing Stuff\\Append Tetsing\\file3.txt");
        ArrayList<String> lines = new ArrayList<String>();
        ArrayList<Integer> num = new ArrayList<Integer>();
        ArrayList<Integer> num2 = new ArrayList<Integer>();
        try {
            Scanner scanner = new Scanner(file);
            while (scanner.hasNextLine()) {
                lines.add(scanner.nextLine());
                String delimiter = " &";
                for(int i=0; i<lines.size(); i++) {
                    if(lines.get(i).contains(delimiter))
                        num.add(i);
                }
                for(int i=1; i<=lines.size()+1; i++)
                    if(num.get(i-1) != num.get(i)){
                        num2.add(num.get(i));
                        System.out.println(lines.get(num2.get(i)));
                }
            }
        scanner.close();
        } catch (FileNotFoundException e) {
        System.out.println("Cannot find file.");
        }
    }
}

我收到了错误

线程“主”java.lang.IndexOutOfBoundsException 中的异常:索引:1,大小:1 在 java.util.ArrayList.RangeCheck(未知来源) 在 java.util.ArrayList.get(未知来源) 在 Inputs.main(Inputs.java:21)

第 21 行,

if(num.get(i-1) != num.get(i)){

我认为这是因为我从 i 中减去 1,但我不确定为什么这是一个问题,因为我将 i 初始化为 1 而不是 0 以避免这种情况。 任何帮助,将不胜感激;我也尝试过 StringBuffer .append() 方法,但没有成功,但如果你有一个可以使用该方法或其他方法的解决方案,那将是花花公子。

【问题讨论】:

  • 1) 对代码块使用一致且符合逻辑的缩进。代码的缩进是为了帮助人们理解程序流程。 2) 始终复制/粘贴错误和异常输出。 3) 请对代码、输入/输出和结构化文档(如 HTML 或 XML)使用代码格式。
  • 您不能简单地从数组中的另一个索引开始。数组总是从 0 开始。你可以在其他地方使用i-1 来补偿偏移量。
  • 顺便说一句:如果您试图在只有一个位置(或如它所说的大小 1)进入位置 0 的数组中获得“i-1”(即 0)和“i”(即 1)没问题,但第二次访问位置 1 会给你 outOfBoundsException。
  • @AndrewThompson,我修正了缩进并引用了错误。
  • @KBorja,为什么我的数组大小只有 1?

标签: java if-statement append concatenation


【解决方案1】:

您的问题不是 num.get(i-1) 而是 num.get(i) 导致 java.lang.IndexOutOfBoundsException: Index: 1, Size: 1

你的for循环也可以重写为:

for(int i=0; i<lines.size(); i++) {
      if(num.get(i) != num.get(i+1)){
             num2.add(num.get(i+1));
             System.out.println(lines.get(num2.get(i)));
      }
}

【讨论】:

  • 恐怕我不明白——为什么num.get(i)会导致这个异常?我将 for 循环更改为您建议的循环,但异常没有改变。
  • 哦,当行的大小仅为 1 时,num.get(i) 将为 1(索引为 2)。好的。现在我只是不明白为什么行的大小只有 1,因为它正在阅读的文本文档中有 5 行。
【解决方案2】:

异常是由于num.get(i) 而不是num.get(i-1) 而生成的,因为num 包含line.size() 元素并且循环正在尝试访问lines.size()+1 元素。

【讨论】:

  • 我重写了我的 for 循环(参见 Mathias Ghys 的回答),这样就没有更多的 lines.size()+1 内容了,但这并没有帮助。
【解决方案3】:

借助本网站上的其他问题和其他一些网站上的一些东西,我解决了这个问题。我基本上重新做了我所有的代码,但这里是:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Scanner;
public class AppendIfFromFileScanner {
    public static void main(String args[]) {
        File file = new File("C:\\Users\\frencke\\workspace\\Testing Stuff\\Append Tetsing\\file3.txt");
        ArrayList<String> lines = new ArrayList<String>();
        String delimiter = ".*\\s+&.*";
    try {
        FileWriter fstream = new FileWriter("file4.txt");
        BufferedWriter out = new BufferedWriter(fstream);
    try {
        Scanner scanner = new Scanner(file);
        while (scanner.hasNextLine()) {
            lines.add(scanner.nextLine());}
for(int i=0; i<lines.size(); i++){
    for(String s=null; i<lines.size(); i++){
        s = lines.get(i);
        if(!s.matches(delimiter))
        out.write("\r\n" + s);
        else if(s.matches(delimiter))
        out.write(s);}
}
    }catch (FileNotFoundException e) {
System.out.println("Cannot find file.");
}out.close();
}catch (Exception e) {
        System.err.println("Error: " + e.getMessage());
    }
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-03
    • 2019-06-17
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 2017-02-15
    • 2018-07-26
    • 1970-01-01
    相关资源
    最近更新 更多