【问题标题】:Arraylist Index out of bound [duplicate]Arraylist索引超出范围[重复]
【发布时间】:2020-02-13 23:27:47
【问题描述】:

作业需要读取两个文件并将学生的信息输入两个单独的ArrayLists。然后我需要执行 2 个功能:组合两个列表并对组合列表进行排序。

public abstract class Tools {
    public static ArrayList<JUPASStudent> readJUPASFile(String f) throws Exception {
        ArrayList<JUPASStudent> jList = new ArrayList<JUPASStudent>();

        BufferedReader readbuffer = null;
        readbuffer = new BufferedReader(new FileReader(f));
        String strRead;
        while ((strRead = readbuffer.readLine()) != null) {
            String splitarray[] = strRead.split("/t");
            String firstentry = splitarray[0];
            String secondentry = splitarray[1];
            JUPASStudent x = new JUPASStudent(firstentry, Double.parseDouble(secondentry));
            jList.add(x);
        }

        readbuffer.close();
        return jList;
        }

    public static ArrayList<NonJUPASStudent> readNonJUPASFile(String f) throws Exception {
        ArrayList<NonJUPASStudent> njList = new ArrayList<NonJUPASStudent>();

        BufferedReader readbuffer = null;
        readbuffer = new BufferedReader(new FileReader(f));
        String strRead;
        while ((strRead = readbuffer.readLine()) != null) {
            String splitarray[] = strRead.split("/t");
            String firstentry = splitarray[0];
            String secondentry = splitarray[1];
            NonJUPASStudent x = new NonJUPASStudent(firstentry, Double.parseDouble(secondentry));
            njList.add(x);
        }

        readbuffer.close();
        return njList;
    }

    public static ArrayList<Student> combineArrayList(ArrayList<JUPASStudent> S1, ArrayList<NonJUPASStudent> S2) {
        ArrayList<Student> sList = new ArrayList<Student>();

        for (int i = 0; i < S1.size(); i++)
            sList.add(S1.get(i));
        for (int i = 0; i < S2.size(); i++) 
            sList.add(S2.get(i));

        return sList;
    }

    public static ArrayList<Student> sort(ArrayList<Student> s){
        for (int i = 0; i < s.size()-1; i++) {
            for (int j = 0; i < s.size()-i-1; j++) {
                if (s.get(j).getResult() > s.get(j+1).getResult()) {
                    Student Temp = s.get(j);
                    s.set(j, s.get(j+1));
                    s.set(j+1, Temp);
                }
            }
        }
        return s;
    }
}

但是,我不断收到“索引 1 超出长度 1 的范围”

【问题讨论】:

  • 欢迎来到 SO。请阅读How to Ask 并注意,在询问异常时,您应该发布堆栈跟踪并标记那里提到的代码行。简而言之,您收到的消息意味着您正在尝试访问仅具有索引 0(即长度 1)的数组的索引 1。
  • 请发布错误的堆栈跟踪。

标签: java regex for-loop arraylist collections


【解决方案1】:

在内部循环中,您定义了对错误计数器的约束。而不是:

for (int j = 0; i < s.size()-i-1; j++)

应该有:

for (int j = 0; j < s.size()-i-1; j++)

【讨论】:

  • 好地方。再举一个例子,说明为什么更有意义的变量名称有助于减少由拼写错误(或混淆变量)导致的错误。
  • 谢谢,我刚刚修改了代码,但问题仍未解决。
【解决方案2】:

在 java.util 包中,我们可以:

  • Collections.sort(列表); // 对列表进行排序,例如:

Collections.sort(Arrays.asList(13, 4));

  • Collections.addAll(Collection c, T... 元素); // 加入列表,例如:

Collections.addAll(Arrays.asList(13, 4), Arrays.asList(3,4,5));

所以你不再需要编写自己的函数了。

【讨论】:

  • 由于作业限制,我无法使用 collections.sort :(
【解决方案3】:

您面临的问题可能在下面一行。 在方法 readNonJUPASFile 和 readJUPASFile

String secondentry = splitarray[1];

您正在根据 /t 拆分字符串。如果您希望根据选项卡拆分它,您应该给出 \t。如果你的行不包含 /t,你可能会得到一个 ArrayIndexOutOfBoundsException。您应该在分配变量之前检查长度,例如

if (splitarray.length > 1) {
   String firstentry = splitarray[0];
   String secondentry = splitarray[1];
}

【讨论】:

【解决方案4】:

您能否添加一些 system.out 语句。它将帮助您查看错误在哪里。我怀疑文件中的数据。

【讨论】:

    猜你喜欢
    • 2021-12-10
    • 2019-03-25
    • 2016-05-03
    • 2017-07-30
    • 1970-01-01
    • 2012-08-24
    • 2014-04-11
    • 1970-01-01
    相关资源
    最近更新 更多