精华内容
下载资源
问答
  • 如果集合有重叠元素,比如总人口集合、男性集合、女性集合,那么对这三个集合的表示,要谨慎使用链表。如下图: 注意,上面图,使用的是Add(Node),而非使用Add(Value),两者重大区别,前者,三条链表类...

     如果集合有重叠元素,比如总人口集合、男性集合、女性集合,那么对这三个集合的表示,要谨慎使用链表。如下图:

     

     

     

     

     

     

        注意,上面图中,使用的是AddNode),而非使用AddValue),两者有重大区别,前者,三条链表类共同修改一个链表,内存占用少,但是集合一旦有重叠就会引起错乱,后者每AddValue)一次,就会重新new一个新的结点(查看Add的方法就知道了,里面有一个new Node()的动作),于是就会形成三条独立的链表,互不相干,也不会出现上述错误,但是同一个对象就拥有了多个克隆体,多占用了不少内存,而且,如果对其中一个链表的某个node中的value进行修改的话,就必须需要考虑同时修改其他链表中的值相同的value对象,C#双链表提供了Findvalue)函数,用于在链表中找到引用value(非值相等,而是引用相等)的Node,然后使用Removenode)将该结点删除。由于每个value可能有多个克隆,为了保持一致性,修改某个集合中的某一value的属性时,还必须要修改其他集合中的相同值的value的属性。举个例子,比如要在三个集合中添加人,第一个是男的,第二个男的,第三个是女的,第四个是男的,分别输出三个集合的人数,然后把第一个人删除,再输出三个集合的人数,程序如下:

     

     

      

     

         改进方法,使用三个顺序表来完成,这样对各自顺序表增加要素或者删除要素都不影响其他顺序表,因为顺序表基于数组,对于任何一个value,都有对应的若干引用,value没有链表那种链式结构,它们是靠数组的Index来获得的。更重更要的是,内存中,任何一个value只需要一个拷贝,而不需要多个拷贝,这样就节省了内存,而且对value的修改更加方便,只需要修改一次即可。

     

     

    我们假设使用的是Addnode)方法添加链表,而非使用Addvalue)方法。第一步,往All链表中添加一个男性,同时Male链表中也要加入该男性,第二步,往All链表中添加一个男性,同时Male链表也要加入该男性(重复了),第三步,往All链表加入一个女性,同时Female链表也加入该女性要素,此时,加入的女性成员同时也加入了Male链表中,造成错误。根本原因在于,链表的前后引用关系,三个链表类对其有三个引用,但是操作的确是统一链表。当集合重叠的时候,一定出错。但是要注意的是,这种“同一个结点加入不同链表”的添加方法,只有在自定义的链表泛型类中才能使用,C#LinkedList<>是禁止向链表中加入一个已经属于其他链表的结点的,下面这段程序因为违法了这一规定而报错:

     

        若使用自定义自定义链表类(可以加入属于另外一个链表的结点),按上面顺序加入这几个人会有什么后果呢?后果是,第一步,indi1加入了All链表和Male链表;第二步,在All链表尾部加入valueindi2的结点(此时indi2成为链表All和链表Male的尾结点),然后在Male链表尾部(尾部结点的value已经是indi2)再次加入这一结点(因为这个人是男的),这是就会产生这样一个后果:node2next属性等于他自己,也就是形成了死循环,此时计算AllMale链表的长度,则陷入死循环,无法得出结果。程序如下:

    示意图为:

    改进方法,使用三个顺序表来完成,这样对各自顺序表增加要素或者删除要素都不影响其他顺序表,因为顺序表基于数组,对于任何一个value,都有对应的若干引用,value没有链表那种链式结构,它们是靠数组的Index来获得的。更重更要的是,内存中,任何一个value只需要一个拷贝,而不需要多个拷贝,这样就节省了内存,而且对value的修改更加方便,只需要修改一次即可。

    展开全文
  • import java.util.ArrayList; import java.util.Iterator;... * 不能创造新的集合,还用之前的集合 */ /* * 思路:造一个新的集合,遍历旧的集合,新集合和旧集合进行比较,如果没有 * 就进来,如果...
    package cn.itnan.ArrayList;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    
    /**
     * 
     * @author Stone
     *  去除字符串重复的值
     *  不能创造新的集合,还用之前的集合
     */
    /*
     * 思路:造一个新的集合,遍历旧的集合,新集合和旧集合进行比较,如果没有
     * 就进来,如果有。就不进来。
     */
    
    
    public class ArrayListTest {
    	public static void main(String[] args) {
    		//创建迭代器
    		ArrayList list = new ArrayList();
    		list.add("nan");
    		list.add("jie");
    		list.add("ying");
    		list.add("nan");
    		list.add("jie");
    		list.add("ying");
    		list.add("nan");
    		list.add("jie");
    		list.add("ying");
    		list.add("nan");
    		list.add("jie");
    		list.add("ying");
    		
    		/*
    		 * 通过选择排序的思想旧可以解决这个问题
    		 */
    		for(int x = 0;x<list.size()-1;x++) {
    			for(int y = x+1;y<list.size();y++) {
    				if(list.get(x).equals(list.get(y))) {
    					list.remove(y);
    					y--;
    				}
    			}
    			
    		}
    		//创建迭代器
    	      Iterator it = list.iterator();
    	      while(it.hasNext()) {
    	    	 String s =  (String) it.next();
    	    	 System.out.println(s);
    	      }
    		}
    
    }
    

    展开全文
  • 不可变数据类型也就是说集合中的每一个元素,一旦放到集合中,这个元素就是不能被修改的 集合类型要求元素是独一无二的,不能存在相同元素,但是如果其中的某一个元素是可以被改变的,它一旦改变之后可能会和其他...

    不可变数据类型也就是说集合中的每一个元素,一旦放到集合中,这个元素就是不能被修改的
    集合类型要求元素是独一无二的,不能存在相同的元素,但是如果其中的某一个元素是可以被改变的,它一旦改变之后可能会和其他的元素相同,这样子的话集合类型就会出现错误,所以集合类型要求,该元素不能是可变数据类型
    不可变数据类型有哪些?
    整数,浮点数,复数,字符串类型,元组类型等
    列表类型是可以被修改的数据类型,这个类型一旦被放到集合中,这个集合就可能会出错

    展开全文
  • NOTICE: 代码是按照源码顺序依次贴上来的,直接...假设两个元素依值递增有序排列的线性表 A 和 B 分别表示两个集合(即同一表元素值各不相同),现要求另辟空间构成一个线性表 C,其元素为 A 和 B 中元素的...

    NOTICE: 代码是按照源码顺序依次贴上来的,直接复制就能跑!

    环境:

    Visual Stdio Code

    PS:如果你先看了我的上一篇文章,这个算法就很好解决,如果没有看上一篇文章,只能一点一点往下看、慢慢分析啦~

    题目

    假设有两个元素依值递增有序排列的单链表 A 和 B 分别表示两个集合(即同一表中的元素值各不相同),现要求另辟空间构成一个单链表 C,其元素为 A 和 B 中元素的交集,且表 C 中的元素也依值递增有排列。试对顺序表编写求 C 的算法。

     

    分析

    因为两个表都是递增有序排列的,所以只需要遍历两个表,然后找到值相等的元素,插入到表 C 中即可。

    代码:

    初始化:

    #include<stdio.h>
    #include<stdlib.h>
    
    #define OK 1
    #define ERROR 0
    
    typedef int ElemType;
    typedef int Status;
    
    typedef struct LNode
    {
        ElemType data;
        LNode *next;
    }LNode, *LinkList;
    
    Status InitList(LinkList &L)
    {   // 初始化单链表 L
        L = (LinkList)malloc(sizeof(LNode));
        L->next = NULL;
    
        return OK;
    }//InitList

    生成单链表:

    Status CreateList(LinkList &L, int e)
    {   // 创建单链表 L
        LinkList p = L;
        while(p->next)
            p = p->next;
        LinkList temp = (LinkList)malloc(sizeof(LNode));
        temp->data = e;
        temp->next = NULL;
        p->next = temp;
    
        return OK;
    }//CreateList

    打印单链表:

    Status DispList(LinkList &L)
    {   // 打印单链表 L
        LinkList p = L;
        p = p->next;
        while(p)
        {
            printf("%d\t", p->data);
            p = p->next;
        }
        return OK;
    }//DispList

    求交集,生成表 C:

    Status ListIntersection(LinkList &A, LinkList &B, LinkList &C)
    {   // 将表 A 和表 B 的交集放在新开辟的表 C 中
        LinkList p, q;
        p = A; p = p->next;
        q = B; q = q->next;
        while(p && q)
        {
            if(p->data < q->data)  // 如果 A 中的值小于 B 中的值,就让 p 向后移
                p = p->next;
            else if(p->data > q->data)  // 如果 A 中的值大于 B 中的值,就让 q 向后移
                q = q->next;
            else // p->data == q->data  // 两值相等,生成表 C
            {
                CreateList(C, p->data);  // 不需要另写代码生成表 C,只需要调用 CreateList() 函数
                p = p->next;     // 本行和下一行代码的含义: p 和 q 都向后移动,为下一次比较做准备
                q = q->next;
            }
        }
    
        return OK;
    }//ListIntersection

    主函数:

    int main()
    {
        LinkList A, B, C;
        // 初始化
        InitList(A);  InitList(B);  InitList(C);
        // 生成节点
        for(int i = 1; i < 6; i++)
            CreateList(A, i);
        printf("\n单链表 A 为:\n");
        DispList(A);
        for(int j = 3; j < 8; j++)
            CreateList(B, j);
        printf("\n单链表 B 为:\n");
        DispList(B);
        // 交集
        ListIntersection(A, B, C);
        printf("\n最终生成的单链表 C 为:\n");
        DispList(C);
    
        return OK;
    }

    说明:

    我们写这个算法之前,应该先分析它有几种情况。

    p = A->next; 
    q = B->next;

    时, 一共有三种情况:

    p->data == q->data;  // 也正是我们想要的
    p->data < q->data;
    p->data > q->data;

    如果是二者相等,就让 C 生成新的节点并存储该 data,不要忘了最后让 p, q 向后移动;

    如果是第二种情况,就让 p 向后移动,但是不要动 q,因为我们想找的是二者相等的元素,而这时的 p 小,q 大,我们必须让 p 出现等于或大于(如果没有相等的值的话)的值才行,且题目中给出的条件也说明了 A 、B 都是递增有序排列的;

    如果出现第三种情况,就让 q 向后移动,p 不要动。原因跟第二种情况相同。

    运行结果示意图:

    交集为空的情况:

    THE END!

    展开全文
  • 是这样的,今天的力扣题求数组子集,但是要求不能有重复的,我想的难道要暴力比较?但是又想了一下,实现的可能性很小,因为子集中元素的个数也是个问题。直接用本方法吧。 力扣:90、子集Ⅱ 笨方法 原本上网搜了...
  • 夫陶公清风千古,余又何人,敢称庶几 文章目录介绍一、基本命令1.增加/删除元素2.获得集合中的所有元素3.判断元素是否在集合中4....集合中不能有相同元素,加入相同元素会被忽略掉。 返回值是成功加入集合的元素.
  • java的Set集合

    万次阅读 多人点赞 2018-11-05 21:40:41
    概述 Set集合类似于一个罐子...Set集合允许包含相同的元素,如果试图把两个相同元素加入同一个Set集合中,则添加操作失败,add()方法返回false,且新元素不会被加入。 HashSet类 HashSet是Set接口的典型实现,...
  • javaSet集合

    2019-10-08 12:50:35
    概述: Set集合类似于一个罐子,程序可以依次把多个...Set集合允许包含相同的元素,如果试图把两个相同元素加入同一个Set集合中,则添加操作失败,add()方法返回false,且新元素不会被加入 HashSet类HashSet是S...
  • JavaSet集合

    热门讨论 2020-03-02 19:08:10
    1 Set集合 1.1 Set集合概述 特征: 无序,不可重复 ...不可重复: 在一个Set集合中不能出现相同元素 interface Set< E >    --| class HashSet< E > 底层是哈希表存储数...
  • Java的Set集合

    2016-08-13 01:47:51
    Set集合,类似于一个罐子,程序依次把多个对象“丢进”Set集合,而Set...Set集合允许包含相同元素,如果试图把两个相同元素加入同一个Set集合中,则添加操作失败,add()方法返回false,且新元素不会被加入。上面
  • HashMap判断元素是否相同主要两个方法,一个是判断key是否相同,一个是判断value是否相同 HashSet不能添加重复的元素,当调用add(Object)方法时候, 首先会调用Object的hashCode方法判hashCode是否已经存在,...
  • Java的Collection集合

    2021-04-01 20:15:57
    1.List接口 有序集合,存储和读取元素的顺序相同 允许存储重复的元素 索引,可以通过普通for循环遍历 Vector集合、ArraList...Collection接口是所有单列集合的最顶层接口,定义的是所有单列集合中的共性方法
  • 前端的页面提交一个表单数据,传到后台,我需要做判断这个表单和已有的表单数据是否有完全相同的,如果有相同的数据,那么就返回一个false,这一个表单不能被保存,如果不同,就可以保存到数据库。 一,实现 1. 最...
  • java集合

    2018-10-25 07:39:35
    set和list公用一个接口collection,set中不能有相同元素,list要有相应顺序。 map——记住哈希映射的相关存储方法。 hashset和hashmap的区别: 一个存取set,一个存储map;一个元素不可重复,一个键位不可重复。....
  • set中不能添加相同元素,判断两个对象是否相等会调用equals()方法 Set中的实现类HashSet、LinkedHashSet、TreeSet HashSet HashSet是Set接口的典型实现,大多数时候使用Set集合时都使用这个实现类。 HashSet按照...
  • 去除集合中的重复元素,如果是去除对象(名字年龄都相同的学生对象),不能用下面的方法,我就不写了好累啊,,,,, 方法一: 1:创建新集合 2:遍历旧集合,获取得到每一个元素 3:拿到这个元素到新集合去找,看看...
  • Java集合之Set集合

    2019-05-28 12:22:27
    首先Set集合不能拥有相同的元素,它与Collection的方法上没有太多的区别,只是行为不同,即不能有相同元素. HashSet实现类 HashSet是Set的接口的典型实现,大多数时都会使用HashSet,使用的时Hash算法来存储集合中的...
  • 字典和集合

    2019-10-27 22:43:59
    无序,python解释器就不能通过索引(位置)区分集合中的相同元素,所以集合中不能有相同的元素。 集合用大括号{ }表示。 集合中元素的数据类型可以不同,但集合中不能嵌套列表、元组、集合、字典。 a={1,1,3} ...
  • Set集合

    2021-03-25 17:54:49
    **Set集合存储的元素是无序的,而且不能存储重复的元素,**每当新的元素存入的时候,Set集合会先去过滤,如果发现和集合中元素出现重复,就不允许添加。 应用场景 当我们不想让集合中出现重复的元素的时候,使用...
  • 集合的定义是“把一定范围的、确定的、可以区别的事物当作一个整体来看待” Python程序中的集合跟数学上的...互异性决定了集合中不能有重复元素,这一点也是集合区别于列表的关键。 3确定性(任给一个元素,该元素
  • LinkedHashSet集合

    2021-04-19 10:18:26
    2.由于是集合,不会有相同元素 3.不存在索引概念,所以不能使用for循环遍历 LinkedHashSet集合继承Set的函数 1.add(元素) 功能:向集合中添加元素 2.remove(元素) 功能:删除集合中指定元素(第一次出现的) 3....
  • 集合

    2020-12-26 16:21:23
    但是数组一个缺点:数组一旦定义,长度将不能再变化。 在实践,我们需要保存一些变长的数据集合,需要保存一些能够动态增长长度的容器来存储数据,同时我们需要对数据的保存的逻辑可能各种各样,于是就了各种...
  • 5 集合类型 5.1 增加/删除元素 Sad key number [number …] ...因此在一个集合中不能有相同元素,所以如果要加入的元素已经存在于集合中就会忽略这个元素。 5.2 获取集合中的所有元素 smembers k...
  • List集合中的序指的是什么意思?

    千次阅读 2018-03-03 18:09:50
    Set里面不允许有重复的元素,所谓重复,即不能有两个相等(注意,不是仅仅是相同)的对象,即假设Set集合中有了一个A对象,现在我要向Set集合再存入一个B对象,但B对象与A对象equals相等,则B对象存储不进去,所以,...
  • List、Set、Map综述 List(顺序,可重复):List接口存储一组不唯一(可以多个元素引用相同的对象)...两个Key可以引用相同的对象,但Key不能重复,典型的Key是String类型,但也可以是任何对象。 一、Arraylist 与...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 890
精华内容 356
关键字:

集合中不能有相同元素