如果条件里面嵌套for循环在android中

时间:2016-09-20 08:52:09

标签: java arraylist

我有两个ArrayList相同的模型类(即ListAListB),我已添加相同的数据。 然后我只在第二个arraylist ListB中添加了一些数据。

现在,我想只获取ListAListB中不同的数据,并将结果存储在第三个arraylist ListC中。

我试过下面的代码。但是,所有元素都存储在ListC中,而不是仅存储在不同的

中。

ArrayList<C> ListC = new ArrayList<>();

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

    for (int j = 0; j < ListB.size(); j++) {

        if (ListA.get(i).getName() == ListB.get(j).getName()) {

            Log.e("Do", "Nothing");

        } else {
            C c = new C(b.get(j).getName());
            ListC.add(c);
        }
    }
}
  

编辑问题

ArrayList<Model> a = new ArrayList<>();
Model model = new Model();
model.setName("MaHi");
model.setAge("20");
a.add(model);

ArrayList<Model> b = new ArrayList<>();
Model model = new Model();
model.setName("MaHi");
model.setAge("20");
b.add(model);
Model model2 = new Model();
model2.setName("Ritu");
model2.setAge("21");
b.add(model2);

ArrayList<Model> c=new ArrayList<>();

现在我想将那些不在arraylist a或arraylist b中的数据(即model2的数据)提取到c的arraylist中;

5 个答案:

答案 0 :(得分:5)

问题在于您正在迭代所有组合

让我们说A = [1, 2, 3]B = [1, 3, 4]。 然后,你的循环将进行比较

  • a=1b=1。两者都是平等的,没有做任何事。这很好。
  • a=1b=3。它们不相等,因此将{3}添加到C。这是你的第一个问题:3实际上是A,但不是你当前的迭代。
  • a=1b=4。它们不相等,因此将{4}添加到C。在这种情况下,这是可以的,因为4不在A
  • a=2b=1。它们不相等,因此将{1}添加到C。但是,1实际上位于A

您是否看到您的解决方案无效?您无法比较每个组合。相反,您必须检查B中的每个元素,如果它位于A中。如果不是,请添加。 这直接转换为伪代码,看起来像

// for every element in ListB
for (int i = 0; i < ListB.length(); i++) {
    B b = ListB.get(i);
    // if this is not in ListA
    if (!ListA.contains(b))
        ListC.add(b);
}

但是,在这里你应该使用for-each循环for (B b: ListB)。 更好的是,只需使用ListC.addAll(ListB); ListB.removeAll(ListA)即可。 (并确保hashCodeequals写得正确 - 但这是一个不同的问题。)

当然,这要求ListAListB中的元素属于同一类型。有关使用标准库方法的解决方案,请参阅Jekin's answer,这些方法也适用于不同类型(当然,只要实现getName())。

这也解决了第二个问题,如您对问题的评论中所述:您无法将字符串与==进行比较,但必须使用equals方法。试试x = new String("a"); y = new String("a"); assert(x==y);assert(x.equals(y));

答案 1 :(得分:1)

由于所有列表都有不同的班级模型(A,B),containsremove方法可能对您没有帮助,因此您可以使用这样的标记contained

Arraylist<C> ListC = new ArrayList<>();

for (int i = 0; i < ListB.size(); i++) {
    // initially, assume that this element is not contained in ListA
    boolean contained = false;

    // check if this element is contained in ListA
    for (int j = 0; j < ListA.size(); j++) {
        if (ListA.get(i).getName().equals(ListB.get(j).getName())) {
            contained = true;
        }
    }

    // if this element is not contained once in ListA,
    if (!contained) {
        // add it to ListC
        C c = new C();
        c.setName(b.get(j).getName());
        ListC.add(c);
    }
}

对于ListB中的每个元素,此标志表示它是否在ListA中至少包含一次。 这可确保ListB中的每个元素最多添加 一次 - 您的循环可以多次添加每个元素。

答案 2 :(得分:1)

问题在于您的代码

if (ListA.get(i).getName() == ListB.get(j).getName()) {

    Log.e("Do", "Nothing");

} else {
    C c = new C();
    c.setName(b.get(j).getName());
    ListC.add(c);
}

您正在使用==运算符来比较字符串值。用于参考比较而非价值比较。虽然这可以在许多不同的编程语言中产生准确的结果,但Java处理不同的值比较。您需要使用equals()equalsIgnoreCase方法而不是==

因此将行更改为

if (ListA.get(i).getName().equals(ListB.get(j).getName()))

注意: ==运算符有时生成正确的结果但仅因为不同的String s'引用共享相同的对象而不是因为它们具有相同的价值。

答案 3 :(得分:-1)

尝试以下代码

Arraylist<C> ListC = new ArrayList<>();

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

     for (int j = 0; j < ListB.size(); j++) {

        if (ListA.get(i).getName().equals(ListB.get(j).getName())) {

            Log.e("Do", "Nothing");

         } else {
            C c = new C();
            c.setName(b.get(j).getName());
            ListC.add(c);
    }
}
}

如果它无法解决您的需求,请告诉我

我一定会帮到你

答案 4 :(得分:-2)

public static void main(String arg[])
{
    ArrayList<String> a=new ArrayList<>();
    a.add("hello");
    a.add("hi");
    a.add("stack");
    a.add("overflow");
    a.add("empty");
    a.add("world1");
    ArrayList<String> b=new ArrayList<>();
    b.add("hello");
    b.add("hi");
    b.add("stack");
    b.add("overflow");
    b.add("empty");
    b.add("world");
    ArrayList<String> c=new ArrayList<>();
    int flag=0;
    System.out.println(a.contains("empty"));
     for (int i = 0; i < a.size(); i++) {

        if(b.contains(a.get(i)))
        {

        }
        else
        {
            System.out.println("haii");
            c.add(a.get(i));
        }

    }
    System.out.println(c.toString());
}

你试试这个例子