我有两个ArrayList
相同的模型类(即ListA
和ListB
),我已添加相同的数据。
然后我只在第二个arraylist ListB
中添加了一些数据。
现在,我想只获取ListA
和ListB
中不同的数据,并将结果存储在第三个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中;
答案 0 :(得分:5)
问题在于您正在迭代所有组合。
让我们说A = [1, 2, 3]
和B = [1, 3, 4]
。
然后,你的循环将进行比较
a=1
与b=1
。两者都是平等的,没有做任何事。这很好。a=1
与b=3
。它们不相等,因此将{3}添加到C
。这是你的第一个问题:3实际上是A
,但不是你当前的迭代。a=1
与b=4
。它们不相等,因此将{4}添加到C
。在这种情况下,这是可以的,因为4不在A
。a=2
与b=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)
即可。
(并确保hashCode
和equals
写得正确 - 但这是一个不同的问题。)
当然,这要求ListA
和ListB
中的元素属于同一类型。有关使用标准库方法的解决方案,请参阅Jekin's answer,这些方法也适用于不同类型(当然,只要实现getName()
)。
这也解决了第二个问题,如您对问题的评论中所述:您无法将字符串与==
进行比较,但必须使用equals
方法。试试x = new String("a"); y = new String("a"); assert(x==y);
和assert(x.equals(y));
答案 1 :(得分:1)
由于所有列表都有不同的班级模型(A,B),contains
和remove
方法可能对您没有帮助,因此您可以使用这样的标记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());
}
你试试这个例子