精华内容
下载资源
问答
  • 【Python】Python生成一个不重复随机list
    万次阅读
    2018-07-17 15:51:53

    在一个范围内,生成一个元素数量固定的随机不重复list.

    错误方法

    使用for循环逐一对生成每个值进行判断,在有重复值的时候,不会被被添加.在需要生成多个随机值的时候,容易出现输出的结果比较少的情况.比如下面需要生成20个随机值,可是一般输出的都不到20.

    import random
    all_num = 100
    a_list = [i for i in range(all_num)]
    b_list = []
    num = 20
    
    for i in range(num):
      random_number = random.randint(1,all_num-1)
      if random_number not in b_list:
        b_list.append(random_number)
    print(b_list)
    print(len(b_list))
    

    可以符合需求的

    import random
    all_num = 100
    a_list = [i for i in range(all_num)]
    num = 20
    
    
    def make_random():
        b_length = 1
        b_list = []
        while b_length<=num:
            random_number = random.randint(1, all_num - 1)
            if random_number not in b_list:
                b_list.append(random_number)
                b_length = len(b_list)+1
        return b_list
    print(make_random())
    print(len(make_random()))
    

    这里使用的list的元素个数来作为判断条件,保证了个数.
    这里有一点值得注意的是b_list放在函数里面比较合适,如果放在函数外面定义,在

    print(len(make_random()))
    

    结果会为21,因为函数里定义b_length=1,函数会再给b_list增加一个元素进去.
    可以适当修改解决…

    直接调用random.sample

    all_num = 100
    num = 20
    result=random.sample(range(1,all_num),num)
    print(result)
    print(len(result))
    

    这个是满足需求且简单的实现方法

    更多相关内容
  • 虽然List能存储重复数据的,但是如果你在对接接口,或者有特殊需求时,就需要考虑用List去存放含重复数据的情况。而我们想利用List存储不重复的元素,一般都使用List自带的contains方法对元素进行判断,如果...

    虽然List是不能存储重复数据的,但是如果你在对接接口,或者有特殊需求时,就需要考虑用List去存放含重复数据的情况。而我们想利用List存储不重复的元素,一般都使用List自带的contains方法对元素进行判断,如果不包含再进行添加,但是这样太耗时了。

    if (!list.contains("/home/" + i)) {
    	list.add("/home/" + i);
    }

    其实我们可以利用set集合存储元素的去重特性来进行list的去重存储,如果set能添加,list就进行添加。

    if (set.add("/home/" + i)) {
    	list.add("/home/" + i);
    }

    下面我们就来测试几种向List存放不重复数据方法的耗时情况:

    public class Test {
    
    	public static List<String> list = new ArrayList<String>();
    	public static Set<String> set = new HashSet<>();
    	public static Set<String> sortset = new LinkedHashSet<>();
    
    	public static void main(String[] args) {
    		// 利用Hashset去重的特性
    		long s1 = System.currentTimeMillis();
    		for (int i = 0; i < 100000; i++) {
    			if (set.add("/home/" + i)) {
    				list.add("/home/" + i);
    			}
    		}
    		System.out.println("使用Hashset进行list去重速度:" + (System.currentTimeMillis() - s1));
    
    		// 利用linkedHashSet去重且存放有序的特性
    		long s4 = System.currentTimeMillis();
    		for (int i = 0; i < 100000; i++) {
    			if (sortset.add("/home/" + i)) {
    				list.add("/home/" + i);
    			}
    		}
    		System.out.println("使用LinkedHashset进行list去重速度:" + (System.currentTimeMillis() - s4));
    
    		// 利用list自带contains方法做判断
    		long s2 = System.currentTimeMillis();
    		for (int i = 0; i < 100000; i++) {
    			if (!list.contains("/home/" + i)) {
    				list.add("/home/" + i);
    			}
    		}
    
    		System.out.println("使用lists的contain方法去重速度:" + (System.currentTimeMillis() - s2));
    
    		// 先存到HashSet,再将全部元素添加到list中
    		long s3 = System.currentTimeMillis();
    		for (int i = 0; i < 100000; i++) {
    			set.add("/home/" + i);
    		}
    		list.addAll(set);
    		System.out.println("使用set去重,然后添加到list中速度:" + (System.currentTimeMillis() - s3));
    
    	}
    
    }

    测试结果如下图:

    经过观察我们可以发现,这其中先使用set进行去重,然后再将set所有元素添加到list中是最快的。但是需要注意的是,List的addAll()方法默认是会将要添加集合的元素添加到list的尾部,如果你的这个list中本身包含了其他数据,添加时对顺序有要求的话要谨慎使用。最好是使用第一种方式,使用set是否可以添加作为判断条件,这样在这个过程中还可以附带其他条件。比较灵活。

    而使用List的contains方法则耗时最久,与其他方式速度相差几十倍。所以大家以后还是尽量不要使用contains来进行去重的判断了。

    喜欢的朋友可以点个赞哦~~

    展开全文
  • Java中list去重(用set元素不重复性)

    万次阅读 2018-03-12 23:08:54
     在网上找了几种方法利用HashSet里面的元素不可重复利用list里面contains方法比较是否存在去重首页我试验了第一种方法public static void main(String args[]){ ArrayList&lt;Integer&gt; arra...

    ArrayList 去重

    在写java代码中会用到ArrayList,使用过程中有一些比较奇葩的业务,需要对重复的数据去重。 
    在网上找了几种方法

    • 利用HashSet里面的元素不可重复
    • 利用list里面contains方法比较是否存在去重

    首页我试验了第一种方法

    public static void main(String args[]){
    
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(1);
        arrayList.add(3);
        arrayList.add(2);
        arrayList.add(3);
    
        arrayList = new ArrayList<>(new HashSet<>(arrayList));
    
        for (int i=0;i<arrayList.size();i++){
            printlns("arrayList ["+ i +"] = "+arrayList.get(i));
        }
    }

    运行结果

    arrayList [0] = 1
    arrayList [1] = 2
    arrayList [2] = 3

    发现确实能行啊,成功了。但是这里排重的是 Integer 类型,如果换成String 类型呢

    ArrayList<String> arrayList = new ArrayList<>();
    arrayList.add("1");
    arrayList.add("2");
    arrayList.add("2");
    arrayList.add("3");
    arrayList.add("2");
    arrayList.add("1");

    运行结果

    arrayList [0] = 1
    arrayList [1] = 2
    arrayList [2] = 3

    发现也行,这下放心了,后来在项目中遇到问题,如果换成对象能实现吗

    所以我就加入了User对象

    static class User{
    
       public User(String name, int age) {
           this.name = name;
           this.age = age;
       }
    
       String name;
         int age;
    }

    并且修改了测试数据

    ArrayList<User> arrayList = new ArrayList<>();
    arrayList.add(new User("111",10));
    arrayList.add(new User("111",10));
    arrayList.add(new User("222",20));
    arrayList.add(new User("111",10));
    arrayList.add(new User("222",20));
    arrayList.add(new User("333",30));
    arrayList.add(new User("111",10));
    arrayList.add(new User("111",10));
    arrayList = new ArrayList<>(new HashSet<User>(arrayList));

    运行结果

    arrayList [0] = 111 , 10
    arrayList [1] = 111 , 10
    arrayList [2] = 222 , 20
    arrayList [3] = 111 , 10
    arrayList [4] = 333 , 30
    arrayList [5] = 111 , 10
    arrayList [6] = 222 , 20
    arrayList [7] = 111 , 10

    发现去重失败,然后我又看了一下Hastset去重原理:发现HashSet里面比较用equals方法,不对,其实应该是equals和hascode方法。

    这里修改一下User类

    static class User{
    
       public User(String name, int age) {
           this.name = name;
           this.age = age;
       }
    
       String name;
         int age;
    
       @Override
       public boolean equals(Object o) {
           if(this == o){
               return true;
           }
           if(o == null){
               return false;
           }
    
           if(getClass() != o.getClass()){
               return false;
           }
           User user = (User) o;
           if(age != user.age){
               return false;
           }
           if(name == null){
               if(user.name !=null){
                   return false;
               }
           }else{
               if(!name.equals(user.name)){
                   return false;
               }
           }
           return true;
       }
    
       @Override
       public int hashCode() {
           return 1;
       }
    }

    运行结果

    arrayList [0] = 111 , 10
    arrayList [1] = 222 , 20
    arrayList [2] = 333 , 30

    成功了,干活

    Object 中 hasCode 
    1. 在一个进程执行期间,如果一个对象的equals的方法做比较所用到的信息没有被修改的话,则对象调用hashCode方法多次,它必须始终如一的返回同一个整数。 
    2. 如果两个对象根据equals(Object o)方法是相等的,则调用者两个对象中任意一对象的hashCode方法必须产生相同的结果 
    3. 如果两个对象根据equals(Object o)方法是不相等的,则调用这个两个对象中任一个对象的hashCode方法返回值不要产生不同的整数,但是如果不同的话,可以提高散列表的性能。

    在HastSet中,基本的操作都是由HashMap低层实现的,因为HastSet底层是用HashMap来存储数据。当向HastSet中添加元素时,首先计算元素的Hashcode值,然后用这个(元素的hashcode)%(HashMap集合的大小)+1计算出这个元素的存储位置,如果这个位置位空,就将元素添加进去;如果不为空,则用equals方法比较元素是否相等,相等就不添加,否则找一个空位添加。

    到这里第一种方法

    第二种方法,那就来了用到contains方法来判断比较,和第一种方法类似,也是用equals方法来判断。

    public static List removeDuplicateWithOrder(List list) {
        List newList = new ArrayList();
        for (Object o : list) {
            if (!newList .contains(o)) newList.add(o);
        }
        return newList;
    }

    转载自 http://blog.csdn.net/gyh790005156/article/details/58136870
    展开全文
  • java中如何使list集合中元素不重复

    千次阅读 2021-03-06 21:07:49
    list集合中的重复值进行处理,大部分是采用两种方法,一种是用遍历list集合判断后赋给另一个list集合,一种是用赋给set集合再返回给list集合。不同方法在不同情况下有各自的优势。相关免费视频教程推荐:java免费...

    395dcb8f41a9677cbb7c6aa7634b191c.png

    对list集合中的重复值进行处理,大部分是采用两种方法,一种是用遍历list集合判断后赋给另一个list集合,一种是用赋给set集合再返回给list集合。不同方法在不同情况下有各自的优势。

    相关免费视频教程推荐:java免费视频教程

    代码如下://set集合去重,不打乱顺序

    public static void main(String[] args){

    List list = new ArrayList();

    list.add("aaa");

    list.add("bbb");

    list.add("aaa");

    list.add("aba");

    list.add("aaa");

    Set set = new HashSet();

    List newList = new ArrayList();

    for (String cd:list) {

    if(set.add(cd)){

    newList.add(cd);

    }

    }

    System.out.println( "去重后的集合: " + newList);

    }//遍历后判断赋给另一个list集合

    public static void main(String[] args){

    List list = new ArrayList();

    list.add("aaa");

    list.add("bbb");

    list.add("aaa");

    list.add("aba");

    list.add("aaa");

    List newList = new ArrayList();

    for (String cd:list) {

    if(!newList.contains(cd)){

    newList.add(cd);

    }

    }

    System.out.println( "去重后的集合: " + newList);

    }//set去重

    public static void main(String[] args){

    List list = new ArrayList();

    list.add("aaa");

    list.add("bbb");

    list.add("aaa");

    list.add("aba");

    list.add("aaa");

    Set set = new HashSet();

    List newList = new ArrayList();

    set.addAll(list);

    newList.addAll(set);

    System.out.println( "去重后的集合: " + newList);

    }//set去重(缩减为一行)

    public static void main(String[] args){

    List list = new ArrayList();

    list.add("aaa");

    list.add("bbb");

    list.add("aaa");

    list.add("aba");

    list.add("aaa");

    List newList = new ArrayList(new HashSet(list));

    System.out.println( "去重后的集合: " + newList);

    }

    hashset不进行排序,还有一种方法是用treeset,去重并且按照自然顺序排列,将hashset改为treeset就可以了。(原本的顺序是改变的,只是按照字母表顺序排列而已)//去重并且按照自然顺序排列

    List newList = new ArrayList(new TreeSet(list));

    更多相关文章教程推荐:java零基础入门

    展开全文
  • List集合(存放有序可重复队列)

    千次阅读 2019-10-06 15:30:17
    //list集合是有序的可重复的 @Test public void listTest1(){ List list =new ArrayList(); //指定索引直接添加在集合最后 list.add(11); list.add(" 111"); list.add('a'); //指定索引 list.add...
  • 利用guava去除List中的重复对象

    千次阅读 2017-06-14 22:34:00
    为什么80%的码农都做了架构师?>>> ...
  • List是有序且重复的,Set是无序不重复的。这里说的顺序有两个概念,一是按添加的顺序排列,二是按自然顺序a-z排列。Set并不是无序的,传统说的Set...不保证元素添加的顺序,不保证元素自然的顺序,不可重复:HashSet...
  • 总结:除了set不可重复,其余均可重复;map中key不可重复,value可重复             除了list和tree有序,其余均无序 转载:...
  • 当我们在一个页面再点击提交操作的时候,需要验证页面的一组数据有没重复的情况。...这样声明,然后我们要取得所有的名字,在取名字的时候注意能用list.add,js 是认帐的,然后你发现自己的逻辑是
  • List中判断是否有重复的元素

    千次阅读 2021-03-01 06:07:01
    1.//判断是否重复List xVali=new ArrayList();xVali.add(参数);HashSet set=new HashSet();for(String i:xVali){set.add(i);}if(!(set.size()==xVali.size())){System.out.println("有重复数据");}2.public static ...
  • List<String> list = new ArrayList<String>(); Set<String> set = new HashSet<>(); for (int i = 0; i < 9000; i++) { String invcode = randomCode(6); ...
  • package day04;... * 可重复集,并且有序。 * 特点是可以根据下标操作元素/。 * 常用的实现类: * ArrayList:使用数组实现,查询更快 * LinkedList:使用链表实现,增删更快。(首尾增删效果明显加快) *...
  • ImmutableSet是一个不可变的集合、线程安全、元素不可重复,它只会获取传入对象的一个副本,而不会改变原来的对象,示例代码如下: Integer a = 3; ImmutableSet&amp;amp;lt;Integer&amp;amp;gt; set5 ...
  • 在实际的开发过程中,某些特定场合,可能会遇到处理list求并集、交集、差集、无重复并集的问题。最近团队有人反馈这个问题,特此总结如下: package com.demo; import java.util.ArrayList; import java.util....
  • Flutter List数组避免插入重复数据

    千次阅读 多人点赞 2020-09-02 10:43:05
    志当存高远。——诸葛亮 List 具有一定长度存在索引的对象集合(长度为0存在索引,长度>0存在索引)
  • 合并两个List并去掉重复

    千次阅读 2021-02-12 20:07:25
    在java8之前比较常规的做法是将两个List添加到一个Set中,因为Set的内容不可重复,所以会自动去重,然后再由Set转为List,代码如下:Set set = new HashSet<>(listA);set.addAll(listB);List ...
  • java为什么吗list允许存储重复元素,而set允许存储重复元素
  • 问题由上篇而来using System.Collections.Generic; using System; namespace pdfToExcel{ class MySortList:SortedList { private class MyComparer : IComparer {
  • map key不可重复

    千次阅读 2017-04-01 09:51:28
    步骤:从数据库读取数据,在ztree下拉树初始化勾选节点时勾选的节点一直...开始以为是ztree初始化出的问题,原来在存放map键值对的时候存放了重复的key,导致存放的key完整。key和value互换位置解决问题。 代码如下:
  • Golang去除slice和list重复元素

    万次阅读 2017-03-21 22:40:40
    Golang去除slice和list重复元素,非常有用的功能 转自:http://studygolang.com/articles/9622 Golang中,利用反射和interface就可以做到,废话看代码 func main() { b := []string{"a", "b", "c", "c",...
  • 整理的Java List Set Map是否有序,元素是否允许重复的说明,如下图:
  • 检查需要插入的数据是否已经存在,同时必须保证插入的数据能有重复, 所有的数据,都成功插入之后才commit; 因为我是先检查数据的正确性,以及数据拼接的,已经2次使用了单层for循环, 想再次来一个双层循环, ...
  • **如题,怎么存放一个对象集合,是有序的,集合中的对象也是不重复的额,最好可以高效一些。**
  • 在Scala中集合有可变(mutable)和不可变(immutable)两种类型,immutable类型的集合初始化后就不能改变了(注意与val修饰的变量进行区别)1.1. 序列不可变的序列 import scala.collection.immutable._ 在Scala中...
  • 在C#中如何List去除重复元素?

    千次阅读 2020-02-11 11:03:51
    List中有两个一样的元素,想把两个都去除,用remove和removeall都不行,list中是对象,distinct好像也太好使,还请各位帮忙解答一下。 代码片段如下: classEdge { publicPointFstart; publicPointFend; } private...
  • List接口实现的存储是有序可重复的,Set接口是无序重复的,能用下标定位数据 结合他们之间的优缺点和数据量,在考虑性能的情况下,笔者写了有序重复的集合 总体是基于LinkedList实现的,重写其add
  • 工作中很多时候需要用到合并... 在java8之前比较常规的做法是将两个List添加到一个Set中,因为Set的内容不可重复,所以会自动去重,然后再由Set转为List,代码如下: Set<String> set = new HashSet<>...
  • android去除list集合重复元素

    千次阅读 2018-04-19 18:07:30
    list特点:有序,可重复 set特点:无序,不可重复所以利用这个特性,可将list的重复元素去除掉,请往下执行!1.调用如下方法/** * 得到去除重复后的集合 * @param list * @return */ private static List&lt...
  • List(列表):元素有序,元素可以重复 (有索引)。 通过元素的equals()方法判断是否重复。ArrayList:https://blog.csdn.net/houyanhua1/article/details/80494916Demo.java:package cn.xxx.demo; import java.util....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 513,463
精华内容 205,385
关键字:

不可重复的list