题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
输入:
10
20 40 32 67 40 20 89 300 400 15
输出:
8
15 20 32 40 67 89 300 400
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int index = input.nextInt();
int[] arr = new int[index];
TreeMap<Integer, Integer> treeMap = new TreeMap<>();
for (int i = 0; i < index; i++) {
arr[i] = input.nextInt();
}
for (int i = 0; i < arr.length; i++) {
treeMap.put(arr[i], arr[i]);
}
System.out.println(treeMap.size());
for (Object o : treeMap.keySet()) {
System.out.print(treeMap.get(o) + " ");
}
}
}
思路:
明明随机数其实这道题不算难,但是和很多同学一样,看到这道题最直接的做法就是先排序再去重,毕竟不是程序大佬,没有那么多奇妙的解法,但是如果你了解过TreeMap的基本特性的话,你就可以利用他的一些特性巧妙地解决排序和去重问题,达到不一样的效果。比如在本题中我就使TreeMap中的key-value值保持一致,插入的过程起到排序的同时,相同的value值也会覆盖原来的value值,达到了去重的效果,执行过程相当于插入和遍历。
TreeMap原理:
因为TreeMap的底层存储是基于红黑树的,同时红黑树更是一颗自平衡的排序二叉树。
常用方法:
添加元素
V put(K key, V value)
:将指定映射放入该TreeMap中V putAll(Map map)
:将指定map放入该TreeMap中
删除元素
void clear()
:清空TreeMap中的所有元素V remove(Object key)
:从TreeMap中移除指定key对应的映射
修改元素
V replace(K key, V value)
:替换指定key对应的value值boolean replace(K key, V oldValue, V newValue)
:当指定key的对应的value为指定值时,替换该值为新值
查找元素
boolean containsKey(Object key)
:判断该TreeMap中是否包含指定key的映射boolean containsValue(Object value)
:判断该TreeMap中是否包含有关指定value的映射Map.Entry<K, V> firstEntry()
:返回该TreeMap的第一个(最小的)映射K firstKey()
:返回该TreeMap的第一个(最小的)映射的keyMap.Entry<K, V> lastEntry()
:返回该TreeMap的最后一个(最大的)映射K lastKey()
:返回该TreeMap的最后一个(最大的)映射的keyv get(K key)
:返回指定key对应的valueSortedMap<K, V> headMap(K toKey)
:返回该TreeMap中严格小于指定key的映射集合SortedMap<K, V> subMap(K fromKey, K toKey)
:返回该TreeMap中指定范围的映射集合(大于等于fromKey,小于 toKey)
遍历方法
for (Map.Entry entry : treeMap.entrySet()) {
System.out.println(entry);
}
Iterator iterator = treeMap.entrySet().iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
for (Iterator i = tempMap.keySet().iterator(); i.hasNext();) {
Object obj = i.next();
System.out.println("key=" + obj + " value=" + tempMap.get(obj));
}
for (Object o : tempMap.keySet()) {
System.out.println("key=" + o + " value=" + tempMap.get(o));
}
更多原理点击 java提高篇----TreeMap