-3

我正在尝试做很简单的事情。遍历数组并在一次迭代中获取两个元素而不是一个。这是代码,也许有人会指出我的错误:)

        for(int i = 0; i < temporary.size(); i = i + 2)
        {

            LayoutInflater inflater;
            inflater = (LayoutInflater) activity.getParent().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View v = inflater.inflate(R.layout.smartuilinear ,
                            null);
                Button ls1, ls2;
                ls1 = (Button) v.findViewById(R.id.ls1);
                ls2 = (Button) v.findViewById(R.id.ls2);
                ls1.setText("i= "+i+ "info " + temporary.get(i).toString());
                int j = i + 1;
                ls2.setText("i= "+j+ "info " + temporary.get(j).toString());

            linear.addView(v);
        }

编辑:大小为奇数时的问题。我不想失去最后一个元素。如果大小为奇数,则通过递减值。


好吧,我想我的问题还不够清楚。循环有效,但如果列表大小不均匀,如何不丢失列表中的最后一个对象?显然,如果列表大小甚至不在最后一个循环中,则不应初始化 j。我希望这能说明一点

4

4 回答 4

2

无论是什么不工作都与循环结构没有直接关系,假设临时是一个具有偶数个元素的列表。我根据您的代码编写了一个简化的测试程序:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test {
  public static void main(String args[]) {
    String[] data = {"aaa","bbb","ccc","ddd"};
    List<String> temporary = new ArrayList<String>();
    temporary.addAll(Arrays.asList(data));
    for (int i = 0; i < temporary.size(); i = i + 2) {
      System.out.println("i= " + i + " first " + temporary.get(i).toString());
      int j = i + 1;
      System.out.println("i= " + j + " second " + temporary.get(j).toString());
    }
  }
}

它运行,输出:

i= 0 first aaa
i= 1 second bbb
i= 2 first ccc
i= 3 second ddd

您需要查看我的测试程序中未显示的其余代码。如果没有关于故障症状和其余变量定义的线索,就不可能诊断故障。

================================================== ==============================

在澄清问题之后,这里是处理偶数或奇数临时大小的测试程序的变体:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test {
  public static void main(String args[]) {
    System.out.println("Odd length");
    test(new String[] { "aaa", "bbb", "ccc", "ddd", "eee" });
    System.out.println("Even length");
    test(new String[] { "xxx", "yyy" });
    System.out.println("Empty");
    test(new String[] {});
  }

  private static void test(String[] data) {
    List<String> temporary = new ArrayList<String>();
    temporary.addAll(Arrays.asList(data));
    for (int i = 0; i < temporary.size(); i = i + 2) {
      System.out.println("i= " + i + " first " + temporary.get(i).toString());
      int j = i + 1;
      if (j < temporary.size()) {
        System.out
            .println("i= " + j + " second " + temporary.get(j).toString());
      }
    }
  }
}

输出:

Odd length
i= 0 first aaa
i= 1 second bbb
i= 2 first ccc
i= 3 second ddd
i= 4 first eee
Even length
i= 0 first xxx
i= 1 second yyy
Empty
于 2013-03-01T15:01:30.193 回答
1

上面的代码有可能在该行中抛出 ArrayIndexOutOfBoundsException

  ls2.setText("i= "+j+ "info " + temporary.get(j).toString());

因为如果临时 List 或 Vector 具有奇数个值,则在 for 循环中检查 i <temporary.size() ,因此上述代码将失败。

于 2013-03-01T14:33:45.807 回答
1

它会在某个时候失败!

如果我是你,我会看看如何改进我在该列表中保存我的价值观的方式。

例如,你可以有更好的东西,比如

List<String[]> temporary = new ArrayList<String[]>();
temporary.add(new String[]{value1, value2});

然后:

    for(int i = 0; i < temporary.size(); i++)
    {

        LayoutInflater inflater;
        inflater = (LayoutInflater) activity.getParent().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.smartuilinear ,
                        null);
            Button ls1, ls2;
            ls1 = (Button) v.findViewById(R.id.ls1);
            ls2 = (Button) v.findViewById(R.id.ls2);
            String[] subValues = temporary.get(i);
            ls1.setText("info " + subValues[0]);
            ls2.setText("info 2" + subValues[1]);
        linear.addView(v);
    }
于 2013-03-01T14:35:16.740 回答
0

我发现只增加 for 循环体内的索引比尝试跟踪多个变量然后在 for 循环声明中“双增量”更简单。

for(int i = 0, s=temporary.size(); i < s; **++i**)
{
    LayoutInflater inflater = (LayoutInflater) activity.getParent().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View v = inflater.inflate(R.layout.smartuilinear,  null);
    Button ls1 = (Button) v.findViewById(R.id.ls1);
    Button ls2 = (Button) v.findViewById(R.id.ls2);
    ls1.setText("i= "+i+ "info " + temporary.get(i).toString());
    **++i;**
    ls2.setText("i= "+i+ "info " + temporary.get(i).toString());
    linear.addView(v);
}
于 2013-03-01T14:35:36.800 回答