我有一个自定义对象的ArrayList。我想要删除重复的条目。
这些对象有三个字段:title, subtitle
和id
。如果一个副标题出现多次,我只需要具有该副标题的第一项(忽略具有该副标题的其余对象)。
我有一个自定义对象的ArrayList。我想要删除重复的条目。
这些对象有三个字段:title, subtitle
和id
。如果一个副标题出现多次,我只需要具有该副标题的第一项(忽略具有该副标题的其余对象)。
你可以使用自定义比较器将ArrayList的内容放入TreeSet中,如果两个标题相同,则应该返回0。 然后,您可以将Set转换为List,并获得没有“重复项”的List。 这是一个Object的示例,当然你应该使用正确的类和逻辑。
public void removeDuplicates(List<Object> l) {
// ... the list is already populated
Set<Object> s = new TreeSet<Object>(new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
// ... compare the two object according to your requirements
return 0;
}
});
s.addAll(l);
List<Object> res = Arrays.asList(s.toArray());
}
List list = (...);
//list may contain duplicates.
//remove duplicates if any
Set setItems = new LinkedHashSet(list);
list.clear();
list.addAll(setItems);
你可能需要重写 "equals()" 方法以便在它们具有相同的副标题(或标题和副标题)时将2个元素视为相等。
List<Item> result = new ArrayList<Item>();
Set<String> titles = new HashSet<String>();
for(Item item : originalList) {
if(titles.add(item.getTitle()) {
result.add(item);
}
}
Set
的 add()
方法,如果元素已经存在,则返回 false
。
Set myset = new HashSet(myArrayList);
或者,从一开始就使用Set,不要使用ArrayList,因为它无法执行您需要的功能。
myArrayList = new ArrayList(new HashSet(myArrayList));
但这是重活,只有在未来的代码中必须依赖于列表时(比如Collections.shuffle()
)才应这样做。 - r00tandy如果我理解正确,你有一个ArrayList<Custom>
,我们称其为list
。你的Custom
类有一个副标题字段,假设有一个getSubtitle()
方法返回String
。你想保留第一个唯一的副标题并删除所有剩余的副标题副本。以下是如何实现:
Set<String> subtitles = new HashSet<String>();
for (Iterator<Custom> it = list.iterator(); it.hasNext(); ) {
if (!subtitles.add(it.next().getSubtitle())) {
it.remove();
}
}
list.iterator()
遍历列表一次,并在每次迭代时再次迭代以检查是否有重复项。如果有——调用iterator.remove()
。这种方法的变体是使用Guava的Iterables.filter(list, predicate)
,其中过滤逻辑在谓词中。
另一种方式(也许更好)是定义equals(..)
和hashCode(..)
方法来处理您的自定义相等逻辑,然后简单地构造一个new HashSet(list)
。这将清除重复项。这个函数可以从一个集合中移除重复项,如果这个集合是有序的,则会保留它们的顺序。在大多数情况下,这个函数的效率足够高。
public static <I, T extends Collection<I>> T removeDuplicates(T collection)
{
Set<I> setItems = new LinkedHashSet<I>(collection);
collection.clear();
collection.addAll(setItems);
return collection;
}
Java8更新:
使用Java8流,您也可以轻松地完成此操作。
ArrayList<String> deduped;
deduped = yourArrayList.stream()
.distinct()
.collect(Collectors.toCollection(ArrayList::new));
这种方法相比于用 ArrayList → Set → ArrayList 的方式,具有保持顺序的优势。
Collections.sort(myList);
A previous = null;
for (A elem: myList) {
if (elem.compareTo(previous) == 0) continue;
previous = elem;
[... process unique element ...]
}
private static List<Integer> removeDuplicates(List<Integer> list) {
ArrayList<Integer> uniqueList = new ArrayList<Integer>();
for (Integer i : list) {
if (!inArray(i, uniqueList)) {
uniqueList.add(i);
}
}
return uniqueList;
}
private static boolean inArray(Integer i, List<Integer> list) {
for (Integer integer : list) {
if (integer == i) {
return true;
}
}
return false;
}
Integer
列表。楼主明确指出该列表包含自定义对象。 - Laf