我是初学者java程序员,我正在尝试制作一个程序,按字母顺序对字符串进行排序,这段代码很乱,但是当它消除了一半的字符串时,我收到索引错误的范围。我确信这是由于我正在增加并且l正在减少但我不确定修复,帮助将被赞赏,并且我不被允许使用sort函数。
import java.util.Scanner;
import java.util.ArrayList;
public class Question6{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
System.out.println("Please enter a string");
String user = in.nextLine();
int l = user.length();
//System.out.println(l);
int i = 0;
System.out.println("Length is " + user.length());
ArrayList<Character> chars = new ArrayList<Character>();
//System.out.println(first);
while (l > 0){
char first = user.charAt(0);
ArrayList<Character> earliest = new ArrayList<Character>();
earliest.add(first);
char char1 = user.charAt(i);
if (char1 <= earliest.get(0)){
earliest.remove(0);
earliest.add(char1);
user = user.substring(0, i) + user.substring(i+1);
chars.add(char1);
System.out.println("earliest in loop " + earliest.toString());
System.out.println("chars in loop " + chars.toString());
System.out.println("string is now " + user);
System.out.println(" ");
i = i+1;
}
else{
chars.add(first);
System.out.println("chars in else " + chars.toString());
i = 0;
}
l = user.length();
}
System.out.println("done ");
}
}
错误是
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 3
at java.lang.String.charAt(Unknown Source)
at Question6.main.(Question6.java:19)
这是字符串“Stack”作为输入
答案 0 :(得分:1)
java.lang.String实施java.lang.Comparable,所以您可以这样做:
if (s1.compareTo(s2) < 0) {
//...
} else if (s1.compareTo(s2) == 0) {
//...
} else {
// ...
}
此外,请避免在循环使用remove(int)
时使用Collection
,更喜欢使用Iterator
这样的内容:
Iterator<String> ite = myListString.iterator();
String str;
while(ite.hasNext()) {
str = ite.next();
if (/* this entry has to be removed from the list */) {
ite.remove();
}
}
答案 1 :(得分:1)
这是因为您在
处对用户字符串进行了子串 user = user.substring(0, i) + user.substring(i + 1);
并且在while循环中
中的 i(递增变量) char char1 = user.charAt(i);
大于字符串用户的长度,并且它尝试访问String用户中不存在的位置的变量,然后它将抛出ArrayIndexOutOfBondException。
例如你的字符串是&#34;一个&#34;在2次迭代之后,字符串将是e,你的i将是2
所以char char1 = user.charAt(i)
;会尝试访问它
char char1 =&#34; e&#34; .charAt(2); (不存在)
我建议改变你的逻辑
答案 2 :(得分:0)
您正在迭代l
,这是用户提供的输入字符串的长度。在每次迭代中,您将i
加1。在迭代中,您正在访问输入字符串的索引i
。除非你陷入其他情况,否则字符串的长度保持不变。因此,i
迟早会大于l - 1
,而位置l
会在数组中没有索引。
此外,正如其他人已经指出的那样,还有其他一些问题。
尝试查看各种排序算法,例如http://www.sorting-algorithms.com/