`
小网客
  • 浏览: 1248874 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中对于List的两种去重操作

    博客分类:
  • Java
 
阅读更多

Java中的List是可以包含重复元素的(hash code 和equals),那么对List进行去重操作有两种方式实现:

方案一:可以通过HashSet来实现,代码如下:

 

class Student {
	private String id;
	private String name;

	public Student(String id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + "]";
	}

	@Override
    public int hashCode() {
	    final int prime = 31;
	    int result = 1;
	    result = prime * result + ((id == null) ? 0 : id.hashCode());
	    result = prime * result + ((name == null) ? 0 : name.hashCode());
	    return result;
    }

	@Override
    public boolean equals(Object obj) {
	    if (this == obj) {
		    return true;
	    }
	    if (obj == null) {
		    return false;
	    }
	    if (getClass() != obj.getClass()) {
		    return false;
	    }
	    Student other = (Student) obj;
	    if (id == null) {
		    if (other.id != null) {
			    return false;
		    }
	    } else if (!id.equals(other.id)) {
		    return false;
	    }
	    if (name == null) {
		    if (other.name != null) {
			    return false;
		    }
	    } else if (!name.equals(other.name)) {
		    return false;
	    }
	    return true;
    }
}

 

 必须实现hashCode和equals两个方法,一会我们会看为啥必须实现

具体的操作代码如下:

 

	private static void removeListDuplicateObject() {
		List<Student> list = new ArrayList<Student>();
		for (int i = 0; i < 10; i++) {
			Student student = new Student("id",  "name");
			list.add(student);
		}
		System.out.println(Arrays.toString(list.toArray()));
		Set<Student> set = new HashSet<Student>();
		set.addAll(list);
		System.out.println(Arrays.toString(set.toArray()));
		list.removeAll(list);
		set.removeAll(set);
		System.out.println(Arrays.toString(list.toArray()));
		System.out.println(Arrays.toString(set.toArray()));
	}

 

 调用代码:

 

	public static void main(String[] args) {
		removeListDuplicateObject();
	}

 

 利用HashSet进行去重操作,为啥必须覆盖hashCode和equals两个方法呢?

我们查看HashSet的add操作源码如下:

 

    public boolean add(E e) {
	return map.put(e, PRESENT)==null;
    }

 

 调用了HashMap进行操作的,我们看HashMap的put操作:

 

    public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }

 

 需要注意的是:

 

if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
......
}

 

 也就是说hash code相等且equals(==)。

复杂度:一边遍历即可,O(n)

 

方案二:直接遍历一遍List进行通过contains和add操作实现

代码如下:

 

	private static void removeListDuplicateObjectByList() {
		List<Student> list = new ArrayList<Student>();

		for (int i = 0; i < 10; i++) {
			Student student = new Student("id", "name");
			list.add(student);
		}
		System.out.println(Arrays.toString(list.toArray()));
		List<Student> listUniq = new ArrayList<Student>();
		for (Student student : list) {
			if (!listUniq.contains(student)) {
				listUniq.add(student);
			}
		}
		System.out.println(Arrays.toString(listUniq.toArray()));
		list.removeAll(list);
		listUniq.removeAll(listUniq);
		System.out.println(Arrays.toString(list.toArray()));
		System.out.println(Arrays.toString(listUniq.toArray()));
	}

 

 其他等同上面。

复杂度:

一边遍历,同时调用了contains方法,我们查看源码如下:

 

    public boolean contains(Object o) {
	return indexOf(o) >= 0;
    }
    public int indexOf(Object o) {
	if (o == null) {
	    for (int i = 0; i < size; i++)
		if (elementData[i]==null)
		    return i;
	} else {
	    for (int i = 0; i < size; i++)
		if (o.equals(elementData[i]))
		    return i;
	}
	return -1;
    }

 可以看到又对新的list做了一次遍历操作。也就是1+2+....+n这样复杂度为O(n*n)

 

结论:

方案一效率高,即采用HashSet的方式进行去重操作
 
0
0
分享到:
评论

相关推荐

    java中List对象列表实现去重或取出及排序的方法

    在Java中,对List对象列表实现去重或取出及排序是一种常见的操作。下面将详细介绍相关的方法和实现。 1. 实体类重写equals和hashCode方法 在Java中,想要去重List对象列表,首先需要重写实体类的equals和hashCode...

    java jsonarray 踢重 去重操作

    在Java中处理JSON数据时,经常需要对JSON数组进行各种操作,其中去重是一个常见的需求。本文将详细介绍如何使用Java对`JSONArray`进行去重操作,并深入探讨背后的原理和技术细节。 ### JSON与Java JSON...

    Java中对List去重 Stream去重的解决方法

    List去重是Java中的一种常见操作,对于List中的重复元素进行去重,从而使得List中的元素变得独一无二。 Java中提供了多种方法来实现List去重,下面我们将对其中的一些方法进行介绍。 使用HashSet去重 HashSet是一...

    Java实现对两个List快速去重并排序操作示例

    因此,我们可以将上述两种操作结合起来,以实现去重并排序的操作。 例如,以下代码演示如何使用HashSet和Comparator对List进行去重并排序操作: ```java List,Object&gt;&gt; listMap1 = new LinkedList,Object&gt;&gt;(); // ...

    Java中List集合对象去重及按属性去重的8种方法

    【Java中List集合对象去重及按属性去重的8种方法】 在Java编程中,当我们处理包含重复元素的List时,有时需要去除其中的重复项。以下文章将详细介绍8种针对List集合对象去重的方法,包括基于对象整体以及按特定属性...

    如何实现java8 list按照元素的某个字段去重

    这两种方法都可以有效地实现基于`name`字段的去重。需要注意的是,第一种方法会保持去重后的元素顺序,而第二种方法则不保证顺序。在实际应用中,应根据具体需求选择合适的方法。 总的来说,Java 8的Stream API为...

    Java数组去重 集合List去重的常用方法总结

    下面将详细介绍两种常用的数组去重方法。 ##### 方法一:For双循环法 这种方法通过两层循环来检查数组中的元素是否重复。其主要步骤如下: 1. **初始化变量**:声明一个整型变量`index`,用于记录不重复元素的...

    java list去重操作实现方式

    本文将详细介绍两种Java中对List进行去重的方法,分别是不带类型参数的写法和带类型参数的写法,并通过示例代码进行演示。 1. 不带类型写法: 这种方法适用于Java版本较低或者不使用泛型的情况。基本思路是创建一个...

    Java List中数据的去重

    但是,需要注意的是,在将List集合转换为Set集合时,需要考虑两种情况:一种是List集合中的数据类型是基本数据类型,另一种是List集合中的数据类型是对象类型。 基本数据类型 如果List集合中的数据类型是基本数据...

    简述Java List去重五种方法

    Java List去重是Java编程中的一种常见操作,用于从List中删除重复的元素。在本文中,我们将介绍五种不同的方法来实现Java List去重。这些方法包括使用Java 8的Stream API、双重for循环、Set集合判断、遍历后判断赋给...

    java8 多条件过滤、去重

    在Java 8中,Stream API引入了许多新特性,极大地增强了集合操作的能力,其中包括多条件过滤和去重。这里我们将深入探讨这两个概念,并结合提供的代码示例进行解释。 1. **多条件过滤** 示例中的多条件过滤是通过...

    java 去除重复元素

    本文将详细介绍如何在Java中去除重复元素,主要关注数组和列表这两种常见数据结构。 一、数组去重 1. 使用HashSet HashSet是一个不允许有重复元素的集合,当我们尝试将一个数组中的所有元素添加到HashSet时,它会...

    java集合与排序详解

    Java 中的集合是指一种数据结构,用于存储和操作一组数据。 Java 集合框架提供了多种类型的集合,包括 Collection、List、Set、Map 等。这些集合类型都具有不同的特点和用途,了解它们的实现原理和使用方法是 Java ...

    【IT十八掌徐培成】Java基础第24天-05.内连接-外链接-集合-去重查询.zip

    今天我们将深入探讨Java中的数据处理,特别是内连接(Inner Join)、外连接(Outer Join)、集合操作以及去重查询。这些概念在实际项目开发中经常被用到,能够帮助我们有效地管理和操作数据。 1. 内连接(Inner ...

    Java Map、List、Set Swing 英文词频统计

    ArrayList和LinkedList是List的两种常见实现。在这个应用中,List可能用于临时存储处理的单词,或者记录单词的出现顺序。如果需要频繁地在列表末尾添加元素,ArrayList通常是更好的选择;而如果需要频繁地在任意位置...

    Java判断2个List集合是否相等(不考虑元素的顺序)

    Java是一种面向对象的编程语言,它提供了许多有用的集合类来存储和操作数据,其中List集合是最常用的集合之一。在实际开发中,我们经常需要判断两个List集合是否相等,不考虑元素的顺序。今天,我们将探讨如何在Java...

    java模拟大乐透开奖学习案例test.txt

    - 这些导入语句是为了使用Java标准库中的`ArrayList`、`Collections`以及`List`接口。其中`ArrayList`用于存储开奖数字,`Collections`提供了一些静态方法对集合进行操作,如排序等。 - **类声明与注释**: - `...

    Java集合排序及java集合类详解(Collection、List、Map、Set)

    ### Java集合排序及java集合类详解(Collection、...以上是对Java集合框架中的`Collection`、`List`、`Set`和`Map`的详细介绍,涵盖了它们的基本概念、常用方法、实现原理等方面,希望对理解和使用Java集合有所帮助。

Global site tag (gtag.js) - Google Analytics