前言:
个人在刷题的时候,觉得一般就是遇到“数据不能重复”就会首先选择使用集合,集合的特点就是不存储重复的元素。
而如果数据有顺序要求,那就选择treeset,如果没有则都可以。
一、TreeSet/HashSet特性
集合(Sets)-存储不重复的元素 | HashSet | 无序集合,基于HashMap实现。 不会记录插入元素的顺序,所以不能保证元素的排列顺序, 获取顺序可能与添加顺序不同。 |
TreeSet | 有序,默认升序。 TreeSet特点的底层数据结构是红黑树,特点: 唯一且有序, TreeSet集合会自动对元素进行排序,默认是升序排序。 |
集合特性:存储不重复的元素。
Java集合中Set都有哪些特性?看这篇就够了!https://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表示重复的数字,放在第一个
步骤
- 遍历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