通过数组迭代两个元素

时间:2013-03-01 14:29:06

标签: java android for-loop

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

        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 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

上述代码有可能在行

中抛出ArrayIndexOutOfBoundsException
  ls2.setText("i= "+j+ "info " + temporary.get(j).toString());

因为你检查我是否&lt;如果临时List或Vector具有奇数个值,上述代码将失败,则for循环中的temporary.size()。

答案 2 :(得分: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);
    }

答案 3 :(得分:0)

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

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);
}