java里如何断定一个集合内的元素都是相等的

zh0 发布于 05/19 15:43
浏览 656
收藏 1

精选30+云产品,助力企业轻松上云!>>>

如今有一个集合,我想断定下外面的元素能否都相等,除用轮回跟set去重外,想就教一下还有没有甚么更好的办法

加载中
0
tcxu
tcxu

核实命题。

  1. 假设一个集合外面的元素都相等, 则去重以后,集合的大年夜小(size())就会变成 1。
  2. 楼主的命题能否是:除用 遍历查询/比较,或 java.util.HashSet 去重外,想就教一下还有没有甚么更好的办法去掉落反复的数据?
  3. 又问,楼主的命题能否是:"若何断定两个集合能否相等?"
  4. 请问楼主能否知道 :"应用java8新特点stream停止List去重"的办法"?
import java.util.*;
import java.util.stream.Collectors;
 
public class Doubleremoved{
    public static void main(String[] args){
 
        List<String> list = new ArrayList<>();
        String a[] = {"earth", "quake", "python", "open", "earth", 
        			  "quake", "open", "source", "source", "computer", "java"};
        for (String s : a)
        list.add(s);
        System.out.println(list);
        List<String> listWithoutDuplicates = list.stream().distinct().collect(Collectors.toList());
 
        System.out.println(listWithoutDuplicates);
 
    }
 
}
D:\java\test>javac Doubleremoved.java

D:\java\test>java -version
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)

D:\java\test>java Doubleremoved
[earth, quake, python, open, earth, quake, open, source, source, computer, java]

[earth, quake, python, open, source, computer, java]

D:\java\test>

最后,请楼主参看:Java中List集合去除反双数据的六种办法, 能够还有一种门路:"5、retainAll和retainAll用法", 不过这类办法仿佛没有 "应用java8新特点stream停止List去重"的办法" 简单 。 

zh0
zh0
Stream.distinct()我知道,Stream.distinct().collect(Collectors.collectingAndThen(Collectors.counting(), i -> i == 1))能够如许写能比创建一个HashSet断定size好一些
zh0
zh0
我想问的是你说的1跟2,不是两个集合也不消去重,只须要断定一个集合中一切的元素是否是一个
0
0x0110
0x0110

断定全相等,取集合的一个元素,取元素个数,构建一个该集合元素,元素个数的集合,断定2集合能否相等(特定办法)。假设相等就全相等。

集合分很多种的下次问成绩写清楚点。能够有些集合不实用这类办法。

zh0
zh0
我这里的集合你可以当数组或许ArrayList便可以了,不是甚么特别的集合,你说的我照样没太懂,参加有一个集合{1,1,2,1,1},按照你的说法,是取一个元素1然后构建一个{1,1,1,1,1}再断定两个集合能否相等?
0
0x0110
0x0110

嗯,你可以将list转换字符流后比较。

0
0x0110
zh0
zh0
是一个办法,但我认为没有直接转成一个HashSet以后断定元素个数能否是1便利
0
SpringBoot中文社区
SpringBoot中文社区
    public boolean equals(Object o) {
        if (o == this)
            return true;
        if (!(o instanceof List))
            return false;

        ListIterator<E> e1 = listIterator();
        ListIterator<?> e2 = ((List<?>) o).listIterator();
        while (e1.hasNext() && e2.hasNext()) {
            E o1 = e1.next();
            Object o2 = e2.next();
            if (!(o1==null ? o2==null : o1.equals(o2)))
                return false;
        }
        return !(e1.hasNext() || e2.hasNext());
    }

这是 AbstractList 的源码,这个就是深比较啊。能满足你的请求吧?

SpringBoot中文社区
SpringBoot中文社区
答复 @zh0 : 噢噢。
zh0
zh0
没有第二个集合,只是断定一个集合的外部元素能否只要一个
0
zh0
zh0

我知道创建一个HashSet然后断定size便可以取得我想要的成果,然则感到应当有更好的办法能做到,能够脑筋没转过去吧,没想起来distinct,能够是本身强迫症吧,想要做的更好一些

0
k
kingMH

1、楼主表达的时辰要留意:集合对应的是set,本身就不存在反复;列表对应的是list;  
2、从算法复杂度分析,“list去重”和“断定元素都是相等的 ”是两个不合的场景,前者必定要全元素遍历,后者能够只须要遍历部分元素,而元素之间的比较是必弗成少的。

zh0
zh0
我说的集合是指<? extends Collection>,这个有歧义?
0
嘴角轻扬30
嘴角轻扬30

哈哈哈,进修了

0

就你这需求来讲,没有比遍历更好的办法,由于你要断定能否全相等,在遍历过程当中只需出现一次a[i]!=a[i+1] 的情况,既可跳出轮回,前往false了,应用Stream 方法,其实照样对一切元素停止了比较,假设是为了进修的话,另说

zh0
zh0
有事理,然则我认为我的场景下晋升其实不大年夜,就照样先用distinct吧
0
tcxu
tcxu

应用迭代法,求证给定集合中元素的唯一性。

import java.awt.*;
public class C{
 static boolean sole(List list){
		if (list.getItemCount()==1) return true;
		if ((list.getItemCount()==2) && (list.getItem(0).compareTo(list.getItem(1))==0))
		return true;
		if ((list.getItem(0).compareTo(list.getItem(1))!=0))
		return false; 
		list.remove(0);
		return sole(list);		
	}

 public static void main(String args[]){
 	List list = new List();
 	list.add("earth");
 	list.add("earth");
 	list.add("earth");
 	list.add("earthquake");
 	System.out.println(sole(list));	 
	}
}

zh0
zh0
答复 @麒 : 我也这么认为
答复 @zh0 : 他这个递归,方法,还不如轮回,假设层级太深了,成绩更多
tcxu
tcxu
答复 @zh0 : 假设不要改变本来的 Collection, 那就取个正本来验证吧。
zh0
zh0
为啥要remove,我不要改变本来的Collection啊
前往顶部
顶部