[英]Interleave - in java doesn't properly work
我在 java 中实现了这种交错方法,但它不能正常工作。 我的错误在哪里? 我想混合 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;
}
提前谢谢了。
问候,科科
错误是您只查看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());
}
}
您可以只使用尺寸,找到最小的尺寸,然后填写 rest,但代码可能会变得丑陋。 此外,上面的代码可以推广到任何两个Iterable<String>
值,而不仅仅是List<String>
。
因为您正在循环 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;
}
实际上,您不会处理两个列表具有不同大小的情况。 这就是错误。
使用您当前的代码
这应该有效(或至少给出一个想法,无法测试)
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;
}
那么,看看你的第一个列表的大小,然后想想 for 循环的执行频率如何?
您的循环仅在达到list1
的大小之前运行。 这可能会导致两个问题:
list2 更长(如您的情况),因此如果 list1 大小为 X,您将添加 list1 中的 X 元素和 list2 中的 X 元素。
更糟糕的是 - list2 更短- 在这种情况下,您会遇到异常,因为您已经超出了列表边界。
您应该执行此循环 Y 次,当 Y 是较短列表的大小时,然后添加较长列表的元素的 rest。
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.