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
对象。我想这会解决问题。
我看到有两个列表:list
和 list2
。在 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));
}
}
有人能告诉我为什么 .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
对象。我想这会解决问题。
我看到有两个列表:list
和 list2
。在 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));
}
}