我有一句话:Humpty Dumpty坐在墙上。 我希望字符串能够交换位置:坐在墙上的Dumpty Humpty a。
所以我写的代码如下:
import java.util.*;
public class Swap{
public static void main(String []args) {
ArrayList<String> sentence = new ArrayList<String>();
sentence.add("Humpty");
sentence.add("Dumpty");
sentence.add("sat");
sentence.add("on");
sentence.add("a");
sentence.add("wall");
int size = sentence.size() ; // for finding size of array list
int numb ;
if(size%2 == 0) {
numb = 1;
}
else {
numb = 0;
}
ArrayList<String> newSentence = new ArrayList<String>();
if(numb == 1) {
for(int i = 0; i <= size ; i = i+2) {
String item = sentence.get(i);
newSentence.add(i+1, item);
}
for(int i = 1; i<=size ; i = i+2) {
String item2 = sentence.get(i);
newSentence.add(i-1, item2);
}
System.out.println(newSentence);
}
else {
System.out.println(sentence);
}
}
}
代码正在编译正确但是当我运行它时,它给出了一个错误。 我对此的理解是,我在数组列表中添加字符串,在其间留下位置。就像在位置3处添加而不首先填充位置2一样。我该如何克服这个问题?
答案 0 :(得分:2)
您正确地解决了您的问题 - 在插入元素之前(在索引0处),您尝试将元素插入到索引1中,并获得IndexOutOfBoundsException
。
如果您想使用现有代码来完成此任务,只需使用一个循环:
if(numb == 1) {
for(int i = 0; i < size-1 ; i = i+2) {
String item = sentence.get(i+1);
newSentence.add(i, item);
item = sentence.get(i);
newSentence.add(i+1, item);
}
}
如果您希望使用Java的内置函数更加复杂,可以使用swap
:
for(int i = 0; i < size-1 ; i = i+2) {
Collections.swap(sentence, i, i+1);
}
System.out.println(sentence);
答案 1 :(得分:0)
您可以使用
初始化newSentence
ArrayList<String> newSentence = new ArrayList<String>(Collections.nCopies(size, ""));
这样,您就可以访问/跳过0
和size
之间的任何位置。因此,您可以保留其余的代码。
记住所有索引都在这里填充空字符串。
答案 2 :(得分:0)
那是因为:
for(int i = 0; i <= size ; i = i+2) {
String item = sentence.get(i);
newSentence.add(i+1, item);//Here you will face java.lang.IndexOutOfBoundsException
}
for(int i = 1; i<=size ; i = i+2) {
String item2 = sentence.get(i);
newSentence.add(i-1, item2);//Here you will face java.lang.IndexOutOfBoundsException
}
而不是这个,请尝试以下代码:
if(numb == 1) {
for(int i = 0; i < size-1 ; i +=2) {
Collections.swap(sentence, i, i+1);
}
}