Java TreeSet / HashSet / 集合框架 [2023.11.29]

前言:

个人在刷题的时候,觉得一般就是遇到“数据不能重复”就会首先选择使用集合,集合的特点就是不存储重复的元素。

而如果数据有顺序要求,那就选择treeset,如果没有则都可以。

一、TreeSet/HashSet特性

集合(Sets)-存储不重复的元素
HashSet

无序集合,基于HashMap实现。

不会记录插入元素的顺序,所以不能保证元素的排列顺序,

获取顺序可能与添加顺序不同。

TreeSet

有序,默认升序。

TreeSet特点的底层数据结构是红黑树,特点:

唯一且有序, TreeSet集合会自动对元素进行排序,默认是升序排序。

集合特性:存储不重复的元素。
Java集合中Set都有哪些特性?看这篇就够了!icon-default.png?t=N7T8https://www.cnblogs.com/qian-fen/p/17420062.html

二、TreeSet的使用,及例题明明的随机数

TreeSet如何创建

创建方法:

1、TreeSet set = new TreeSet();

2、TreeSet <E>treeset = new TreeSet<>();【建议选择】

方法(1)的时候有限制,例如下面例题:

至于具体是什么原因,暂时还没有比较完整的解释:) 

import java.util.Scanner;

import java.util.*;

public class LargeSmallEst {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int m = sc.nextInt();

        sc.nextLine();

        String [] strarr = sc.nextLine().split("\\s+");

        int n =sc.nextInt();

        TreeSet treeset = new TreeSet();

        for(int i=0;i<m;i++){

            if(!treeset.contains(Integer.parseInt(strarr[i]))){

                treeset.add(Integer.parseInt(strarr[i]));

            }

        }

       

        int total = 0;

        if(n<=treeset.size()/2){

            for(int i=0;i<n;i++){

                total+=treeset.first()+treeset.last();

                treeset.pollFirst();

                treeset.pollLast();

            }

            System.out.println(total);

        }else{

            System.out.println("-1");

        }

    }

}

此时使用就会报错。

例题:明明的随机数

描述

明明生成了N个1到500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。

数据范围:  1≤n≤1000  ,输入的数字大小满足 1≤val≤5000 

输入描述:

第一行先输入随机整数的个数 N 。 接下来的 N 行每行输入一个整数,代表明明生成的随机数。 具体格式可以参考下面的"示例"。

输出描述:

输出多行,表示输入数据处理后的结果

 该题目要求对输入的数字进行去重以及排序,也就是集合特点加tree特点、

 题解

import java.util.*;

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //获取个数
        int num = sc.nextInt();
        //创建TreeSet进行去重排序
        TreeSet set = new TreeSet();
        //输入
        for(int i =0 ; i < num ;i++){
            set.add(sc.nextInt());
        }

        //输出
        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}
 

三、HashSet使用:找出数组中重复的第一个数字

描述

【剑指 offer】数组中重复的数字 -- Java 实现_牛客博客

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中第一个重复的数字。

例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

返回描述:

  • 如果数组中有重复的数字,函数返回true,否则返回false。
  • 如果数组中有重复的数字,把重复的数字放到参数duplication[0]中。(ps:duplication已经初始化,可以直接赋值使用。)【结果是只需要返回是否含有重复数字,重复的数字无需返回】

 思路知识点总结

参数描述:

  • int numbers[]表示需要处理的数组
  • int length
  • int [] duplication表示重复的数字,放在第一个

步骤

  1. 遍历numbers数组,将不重复的元素放在set里面(其实这里使用hashset或者treeset均可u。)使用循环来遍历,使用判断语句来判断对当前数组元素的操作。 
  • 若检查到set包含这个元素,则将该值赋给int [] duplication,并且返回true;默认返回false。
  • 若set未包含该元素,则将该值加入set集合
  • 主要用到了set的contain函数和add函数。

package huaweijikao;

import java.util.*;

public class ArrayDupNum {

     public static boolean duplicate(int numbers[],int length,int [] duplication) {

(其实这里使用hashset或者treeset均可。)

        TreeSet<Integer> set = new TreeSet<>();

//循环判断

        for(int i =0 ;i<length;i++){

            if(set.contains(numbers[i])){

                duplication[0] = numbers[i];

                //为了表明实际工作的流程,实际只遍历到第一次发现重复数值的

                for(int element:set){ System.out.println("目前的集合为"+element);}

                return true;

            }else{

                set.add(numbers[i]);

            }

        }

        return false;

    }

    public static void main(String[] args) {

        int []arr={2,3,1,0,2,5,3,1};

        int length = 8;

        int [] duplication={0};

        boolean result = duplicate(arr,length,duplication);

        System.err.println("输出"+duplication[0]);

        System.err.println("输出"+result);

    }

   

}

输出为

0
1
2
3
输出2
输出true

四、待补充,如何修改treeset默认排序。

  • 20
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值