toCharArray,索引越界

toCharArray, Index out of bounds

有人能告诉我为什么 .toCharArray() 行给出索引越界异常吗?为什么它甚至为字符串提供索引 0 大小 0 异常?我还没有定义字符串数组?!

此外,这段代码应该 运行 在 O(n) 时间内对吗?

import java.util.ArrayList;
import java.util.List;


public class FirstNonRepeating {


public static List<Character> list = new ArrayList<Character>();
public static List<Character> list2 = new ArrayList<Character>();

public static String res(String x) {
    char[] y = x.toCharArray();

    for(char c:y){
        list2.add(c);
        if(list.contains(c)){
            list2.remove(c);
        }
        else{
            list2.add(c);
        }
    }

    if(list2.isEmpty()){
    return "NONE";
    }

    else return (""+list.get(0));

    }

public static void main(String[] args) {

    String a="Google";
    String z=res(a);
    System.out.println(z);
}

}

你的例外在这里:

        if (list2.isEmpty()) {
            return "NONE";
        } else return ("" + list.get(0));

您检查是否为空 list2 并尝试从 list 中获取第一个元素,该元素似乎为空并抛出异常。将其更改为:

... else return ("" + list2.get(0));

异常不是因为 .toCharArray()。这是因为您正在检查 if(list.contains(c)) 的条件,因为您在此 list 对象中没有任何值。异常显示在 char[] y = x.toCharArray(); 行,因为它是 JRE 最后正确执行的语句。

尝试在进行任何条件检查之前初始化 list 对象。我想这会解决问题。

我看到有两个列表:listlist2。在 for 循环中,您只添加了元素 list2,每个元素两次!所以list2博科姆

[G, G, o, o, o, o, g, g, l, l, e, e]

for(char c:y){
    list2.add(c); // added first time into list2
    if(list.contains(c)){ // false, as list is empty
        list2.remove(c); // never executed
    }
    else{
        list2.add(c); // added same char second time into list2
    }
}

list 仍然是空的。因此 list.get(0) 产生了

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

排队,

else return (""+list.get(0));

This code should run in O(n) time right?

是的。 for 循环将迭代到输入字符串 a.length 大小。

错误不在 .toCharArray() 方法上。

这是因为你的list是空的。由于您的代码从不向其中添加任何元素。

您还在检查 list2 是否为空状态。

if(list2.isEmpty())

但是在 else 部分,您正试图从 list 中获取实际上是空的。

因此出现错误:索引越界异常

正如上面其他人所说,最初的问题是由于您试图访问一个空列表。我认为您可能想要尝试做的是重新考虑您对问题的解决方案,并且您可能会避免其中的一些陷阱。

您的代码可以稍微简化一下。我想你想要这样的东西。

public class FirstNonRepeating {

    public static String res(String string) {

        char [] characters = string.toCharArray();
        boolean repeat = false;
        char last = characters[0];
        int length = characters.length; 

       for (int x  = 0; x < length - 1; x++){
          if(characters[x] != characters[x + 1]){

                if(x == 0) return Character.toString(characters[x]);

                if(characters[x] != last) return Character.toString(characters[x]);

            }

          last = characters[x];
       }

       return (last != characters[length - 1] ? Character.toString(characters[length - 1]) : "");
    }



    public static void main(String[] args) {

        String a = "Google";
        System.out.println(res(a));

        a = "oobgle";
        System.out.println(res(a));

        a = "oooooe";
        System.out.println(res(a));

    }
}