Java 重复数字数组列表
我想从两个数组列表中获取所有重复的数字,我的代码几乎适用于所有情况,但不适用于以下情况:set oneJava 重复数字数组列表,java,arraylist,duplicate-removal,Java,Arraylist,Duplicate Removal,我想从两个数组列表中获取所有重复的数字,我的代码几乎适用于所有情况,但不适用于以下情况:set one{2.4,5.6,9,3.1,5.6}set two{9,3.1,5.6,5.6}预期返回{5.6,3.1},实际返回{5.6,5.6,3.1} ArrayList<Double> newList = new ArrayList<Double>(); newList.retainAll(newList); return newList; } Arr
{2.4,5.6,9,3.1,5.6}
set two{9,3.1,5.6,5.6}
预期返回{5.6,3.1}
,实际返回{5.6,5.6,3.1}
ArrayList<Double> newList = new ArrayList<Double>();
newList.retainAll(newList);
return newList;
}
ArrayList newList=new ArrayList();
newList.retainAll(newList);
返回newList;
}
第一组{2.4,5.6,9,3.1,5.6}第二组{9,3.1,5.6,5.6}
既然你已经说过它们是集合,为什么这些集合中会有重复的呢
public static void main(String[] args){
double[] t1 = {2.4, 5.6, 9, 3.1, 5.6};
double[] t2 = {9, 3.1, 5.6, 5.6};
ArrayList<Double> newList1 = new ArrayList<Double>();
ArrayList<Double> newList2 = new ArrayList<Double>();
for(double tt:t1){
newList1.add(tt);
}
for(double tt:t2){
newList2.add(tt);
}
newList1.retainAll(newList2);
System.out.println(newList1.toString());
}
publicstaticvoidmain(字符串[]args){
双[]t1={2.4,5.6,9,3.1,5.6};
双[]t2={9,3.1,5.6,5.6};
ArrayList newList1=新的ArrayList();
ArrayList newList2=新的ArrayList();
用于(双tt:t1){
新列表1.添加(tt);
}
用于(双tt:t2){
新列表2.添加(tt);
}
新列表1.保留(新列表2);
System.out.println(newList1.toString());
}
输出:
[5.6,9.0,3.1,5.6]
如您所见,retainAll不会删除重复项。尝试使用Set列表是有序的,但不能保证其成员是唯一的。因此,如果希望从两个集合中获得唯一的成员集,则需要使用一个集合来过滤它们
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class TestRetainAll {
public static void main(String[] args) {
List<Double> list1 = new ArrayList<>();
list1.addAll(Arrays.asList(new Double[] {2.4, 5.6, 9.0, 3.1, 5.6}));
List<Double> list2 = Arrays.asList(new Double[] {9.0, 3.1, 5.6, 5.6});
list1.retainAll(list2);
System.out.println("List (which may contain duplicates)");
for (Double d : list1) {
System.out.println(d);
}
Set<Double> set = new HashSet<>();
set.addAll(list1);
System.out.println("Set (which cannot contain duplicates)");
for (Double d : set) {
System.out.println(d);
}
}
}
您的方式是可行的,但如果两个列表中的某个数字在其中一个列表中出现多次,它将在“重复项”列表中出现多次 如果您不希望重复列表中出现重复项,请使用集合,或者像这样创建自己的方法(效率不高):
公共静态列表交叉点(列表1、列表2)
{
列表=新的ArrayList();
int i=0;
for(T:list1)
{
if(list2.contains(t)和&!list.contains(t))
{
列表。添加(t);
}
}
退货清单;
}
您需要使用Set
从列表1
中删除重复项:
List<Double> list1 = new ArrayList<>(Arrays.asList(2.4, 5.6, 9.0, 3.1, 5.6));
List<Double> list2 = new ArrayList<>(Arrays.asList(9.0, 3.1, 5.6, 5.6));
HashSet<Double> set1 = new HashSet<>(list1);
set1.retainAll(list2 );
System.out.println("set1 = " + set1);
newList
一开始是空的。对它调用retain(newList)
没有效果。也许这会有帮助
public static <T> List<T> intersection(List<T> list1, List<T> list2)
{
List<T> list = new ArrayList<T>();
int i = 0;
for (T t : list1)
{
if (list2.contains(t) && !list.contains(t))
{
list.add(t);
}
}
return list;
}
List<Double> list1 = new ArrayList<>(Arrays.asList(2.4, 5.6, 9.0, 3.1, 5.6));
List<Double> list2 = new ArrayList<>(Arrays.asList(9.0, 3.1, 5.6, 5.6));
HashSet<Double> set1 = new HashSet<>(list1);
set1.retainAll(list2 );
System.out.println("set1 = " + set1);
set1 = [5.6, 3.1, 9.0]