我在java中实现了这个interleave方法,但它无法正常工作。我的错误在哪里? 我想混合使用2个字符串列表。
["a","b","c"]
["1","2","3","4"]
结果应为= [a, 1, b, 2, c, 3, 4]
但我只得到[a, 1, b, 2, c, 3]
。
public static List<String> interleave(List<String> list1,List<String>list2){
List<String> result= new ArrayList<String>();
for(int i=0; i<list1.size(); i++){
result.add(list1.get(i));
result.add(list2.get(i));
}
return result;
}
提前多多感谢。
的问候, 科科
答案 0 :(得分:4)
错误是您只查看list1.size()
,而在您的情况下,第二个列表比第一个列表长。
你应该很可能使用迭代器:
Iterator<String> iterator1 = list1.iterator();
Iterator<String> iterator2 = list2.iterator();
while (iterator1.hasNext() || iterator2.hasNext())
{
if (iterator1.hasNext())
{
result.add(iterator1.next());
}
if (iterator2.hasNext())
{
result.add(iterator2.next());
}
}
你可以只使用尺寸,找到最小尺寸然后填写其余部分,但代码可能会变得难看。此外,上述代码可推广到任意两个Iterable<String>
值,而不只是List<String>
。
答案 1 :(得分:1)
因为你循环遍历list1大小为3.你可以这样做:
public static List<String> interleave(List<String> list1,List<String>list2){
List<String> result= new ArrayList<String>();
if(list1.size()<list2.size()){
for(int i=0; i<list1.size(); i++){
result.add(list1.get(i));
result.add(list2.get(i));
}
for (int i = list1.size(); i < list2.size(); i++) {
result.add(list2.get(i));
}
} else {
for(int i=0; i<list2.size(); i++){
result.add(list1.get(i));
result.add(list2.get(i));
}
for (int i = list2.size(); i < list1.size(); i++) {
result.add(list1.get(i));
}
}
return result;
}
答案 2 :(得分:1)
实际上,您不会处理两个列表都有不同大小的情况。这是错误。
使用您当前的代码
这应该有效(或至少提出一个想法,无法测试)
public static List<String> interleave(List<String> list1,List<String>list2){
List<String> result= new ArrayList<String>();
List<String> minList = list1.size() <= list2.size() ? list1 : list2;
List<String> maxList = list1.size() <= list2.size() ? list2 : list1;
// interleave up to the size of the smaller list
for(int i=0; i<minList.size(); i++){
result.add(list1.get(i));
result.add(list2.get(i));
}
// add the other elements from the bigger list
for(int i=minList.size(); i < maxList.size(); i++) {
result.add(maxList.get(i));
}
return result;
}
答案 3 :(得分:0)
那么,看看你的第一个列表的大小然后考虑for循环执行的频率怎么样呢?
答案 4 :(得分:0)
您的循环只在达到list1
的大小时才会运行。这可能会导致两个问题:
list2更长(如你的情况),所以如果list1的大小是X,你将从list1添加X元素,从list2添加X元素。
更糟糕的是 - list2更短 - 在这种情况下,您将获得异常,因为您的列表边界已用完。
当Y是较短列表的大小时,您应该执行此循环Y次,然后添加较长列表的其余元素。
答案 5 :(得分:0)
public static List<String> interleave(List<String> list1,List<String>list2){
List<String> result= new ArrayList<String>();
int common = Math.min(list1.size(),list2.size());
for(int i=0; i<common; i++){
result.add(list1.get(i));
result.add(list2.get(i));
}
for(int i=common; i<list1.size(); i++){
result.add(list1.get(i));
}
for(int i=common; i<list2.size(); i++){
result.add(list2.get(i));
}
return result;
}
或者:
public static List<String> interleave(List<String> list1,List<String>list2){
List<String> result= new ArrayList<String>();
int max = Math.max(list1.size(),list2.size());
for(int i=0; i<max; i++){
if (i < list1.size()) {
result.add(list1.get(i));
}
if (i < list2.size()) {
result.add(list2.get(i));
}
}
return result;
}