有人可以告诉我为什么.toCharArray()行会给出Index Out of Bounds异常吗?为什么它甚至为String提供索引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);
}
}
答案 0 :(得分:5)
你的例外就在这里:
if (list2.isEmpty()) {
return "NONE";
} else return ("" + list.get(0));
检查空虚list2
并尝试从list
获取第一个元素,该元素似乎为空,并抛出异常。将其更改为:
... else return ("" + list2.get(0));
答案 1 :(得分:1)
我看到有两个列表:list
和list2
。在for
循环中,您只添加了元素list2
,每个元素两次!所以list2
bocomes
[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));
此代码应该在O(n)时间运行吗?
是的。 for循环将迭代到输入字符串a.length
大小。
答案 2 :(得分:0)
异常不是因为.toCharArray()
。这是因为你正在检查if(list.contains(c))
的条件,因为你在这个list
对象中没有任何值。行char[] y = x.toCharArray();
显示异常,因为它是JRE最后一次正确执行的行的语句。
在进行任何条件检查之前尝试初始化list
对象。我想这将解决问题。
答案 3 :(得分:0)
错误不在date_default_timezone_get()
方法上。
因为你的.toCharArray()
是空的。因为您的代码永远不会添加任何元素。
此外,您正在检查list
是否为空状态。
list2
但是在if(list2.isEmpty())
部分,您尝试从else
获取,这实际上是空的。
因此错误:索引超出界限异常
答案 4 :(得分:0)
与其他人上面说的一样,原来的问题是由于你试图访问一个空列表。我认为您可能想要尝试做的是重新考虑您对问题的解决方案,并且您可以避免一些这些陷阱。
您的代码可以简化一点。我想你想要这样的东西。
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));
}
}