我有一个数组列表包含对象(id,name)。如果列表中有重复的名称,需要删除
如果重复,我只需要打印一次名称
如果您不想在列表中出现重复条目,请使用 SET:
注意:您必须覆盖对象(ID,名称)中的等于和哈希码,否则您将在 SET 中找到重复的对象
您可以在Set和List系列的帮助下完成
我们已经了解了如何使用Set系列删除重复项。我们也可以在List家族的帮助下做到这一点。请参考下面的代码。
package com.rais.util;
import java.util.ArrayList;
import java.util.List;
/**
* @author Rais.Alam
* @project Utils
* @date Dec 18, 2012
*/
public class ConverterUtil
{
/**
* @param args
*/
public static void main(String[] args)
{
List<String> original = new ArrayList<String>();
original.add("Tomcat");
original.add("Jboss");
original.add("GlassFish");
original.add("Weblogic");
original.add("Tomcat");
List<String> newList = removeDuplicates(original);
for (String value : newList)
{
System.out.println(value);
}
}
public static List<String> removeDuplicates(List<String> original)
{
List<String> tempList = new ArrayList<String>();
for (String value : original)
{
if (!tempList.contains(value))
{
tempList.add(value);
}
}
return tempList;
}
}
public static boolean checkDuplicate(ArrayList list) {
HashSet set = new HashSet();
for (int i = 0; i < list.size(); i++) {
boolean val = set.add(list.get(i));
if (val == false) {
return val;
}
}
return true;
}
改用 a java.util.Set
。它不能包含重复项。
参考:http ://docs.oracle.com/javase/6/docs/api/java/util/Set.html
Set<String> myNames = new HashSet<String>();
myNames.add("JAMES");
myNames.add("ELLA");
myNames.add("JAMES");
myNames.size() // will return 2
使用 Set 数据结构并实现适当的 Comparator。运行一个循环并将您的对象放入该集合中。打印这套。
Arraylist 提供了一个迭代器,允许从列表本身中删除迭代器返回的最后一个元素。所以我们只记录我们已经看到的名字。一个Set
实现是有帮助的。
Set<String> names = new HashSet<>();
Iterator<MyType> it = getListFromSomewhere().iterator(); // you know how
while(it.hasNext()) {
if (!names.add(it.next().getName()) {
it.remove();
}
}
提示:如果值已经在集合中,则添加到集合返回 false。
评论
您的要求并不那么明确:这里我们保留第一个条目的名称并从列表中删除所有后续条目。如果列表不是按 id 排序的,那么它是相当随机的,保留哪些条目,删除哪些条目。