如何仅将不同的元素从一个arrayList复制到另一个ArrayList

时间:2018-02-11 15:14:01

标签: java loops arraylist foreach

我有一个名为TwoNumbers的类,它创建一个包含两个数字的对象。我创建了一个ArrayList<>包含此对象,我想将这些对象复制到新的ArrayList。

问题是我只想将不同的对象复制到新的ArrayList。 当对象内的数字可能相同时,Java会将每个对象视为不同的对象,并且我不知道如何阻止它复制每个对象。

两个对象包含num1和num2的两个属性,这些属性从fileReader中读入。 所以基本上每个TwoNumbers对象的数据是:

1,2 
3,5
5,4
2,1 //accidentally repeated (2,1 means as 1,2)
4,6
1,2 //accidentlly repeated etc.

在主代码的文件阅读器中,我读了所有这些数据,所以我在ArrayList中有TwoNumbers:

TwoNumbers TwoNumbers = new TwoNumbers(num1,num2); // where num's are the  data to create this object 
TwoNumbersArray.add(TwoNumbers);

对于方法,当元素不存在时,我试图仅向newArrayList添加不同的元素。

我的TwoNumber课程: public TwoNumbers(int n1,int n2)

{
    if(n1 < n2 ){
        this.num1 = n1;
        this.num2 = n2;
    } else
    {
        this.num2 = n1;
        this.num1 = n2;
    }
}

public int getNum1()
{
    return num1;
}

public int getNum2()
{
    return num2;
}

我尝试做的方法是:

public void addNew2 (List<TwoNumbers> TwoNumbersArray, List<TwoNumbers> newArrayList){
        for (TwoNumbers e: TwoNumbersArray){
            for (int i = 0; i<TwoNumbersArray.size(); i++){
                if (e.getNum1() != newArrayList.get(i).getNum1() && e.getNum2() != newArrayList.get(i).getNum2()){
                    newArrayList.add(e);
                }
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

注意:这段代码只能起作用,因为提问者在他的构造函数中使用了这个if语句:

if(n1 < n2 ){
    this.num1 = n1;
    this.num2 = n2;
} else {
    this.num2 = n1;
    this.num1 = n2;
}

我不知道我是否理解你的问题,但尝试这种方法:

public List<TwoNumbers> doStuff(List<TwoNumbers> list) {
    List<TwoNumbers> returnList = new ArrayList<>();
    for (int i = 0; i < list.size(); i++) {
        boolean flag = true;
        for (int j = i + 1; j < list.size(); j++) {
            if (list.get(i).getNum1() == list.get(j).getNum1() && list.get(i).getNum2() == list.get(j).getNum2()) {
                flag = false;
            }
        }

        if (flag) {
            returnList.add(list.get(i));
        }
    }
    return returnList;
}

此方法将遍历列表,如果flag变量设置为false,我们知道该对象是重复的,因此我们不必将其添加到returnList

如果您有其他问题,或者如果您没有回答您的问题,请随时与我联系。

答案 1 :(得分:1)

</div>

由于您在构造函数中保证,number1属性中的数字较小。 在TwoNumbers类中,重写这些方法,如下所示。

List<TwoNumbers> newList = oldList.stream().distinct().collect(Collectors.toList());