题目描述:
给你两个集合,要求 {A} + {B}。
注:同一个集合中不会有两个相同的元素。
输入
多组(不超过 5 组)数据。
每组输入数据分为三行,第一行有两个数字 n,m($0<n,m\leq10000$),分别表示集合 A 和集合 B 的元素个数。后两行分别表示集合 A 和集合 B。每个元素为不超出 int 范围的整数,每个元素之间有一个空格隔开。
输出针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开。
样例输入1 2
1
2 3
1 2
1
1 2
1 2 3
1 2
这道题求的是两个集合的并集,其实我一开始是打算见两个数组,分别储存两个数组,然后将两个数组合并到一个新的数组中。但这样做显然会增加编程困难:因为在合并过程中,你要不断比较A和B两个集合中有没有相同的元素,复杂度能达到n的平方。虽然程序好写,但在空间上实在是很大的浪费!
所以我转头一想,看了看题目,灵光一闪:这道题不用建立两个数组,实际上只要建立一个数组就可以了!因为它的题目只是要求我要输出集合中的元素,所以我们没必要太耿直地将合并后的数组求出在输出结果。我们只需要将两个集合中的元素放入一个数组中,然后将这个数组进行升序排序,然后,(这一步是重点),遍历整个数组,输出该排好序的数组中的元素,在遍历到相同元素的时候,跳过(continue)本次循环即可。
好了,废话不说,先献上代码!
代码如下:
import java.util.Scanner;
public class UnionSetJD {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int a = scanner.nextInt();
int b = scanner.nextInt();
int arrays[] = new int[a + b];
for (int i = 0; i < a + b; i++)
arrays[i] = scanner.nextInt();
for (int i = 0; i < a + b; i++) {
for (int k = i + 1; k < a + b; k++) {
if (arrays[i] > arrays[k]) {
int temp = arrays[i];
arrays[i] = arrays[k];
arrays[k] = temp;
}
}
}
for (int i = 0; i < a + b; i++) {
if(i==a+b-1){
System.out.println(arrays[i]);
break;
}
if (arrays[i] == arrays[i + 1]) //遇到相同元素的时候,选择不输出,跳过!
continue;
System.out.print(arrays[i]+" ");
}
}
}
}
后来我在测评网站上看见一个哥们写的代码很简短,有值得我学习的地方,特此献上供诸位参考!
代码如下:
import java.util.Arrays;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class UnionSetJD {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int a = sc.nextInt();
int b = sc.nextInt();
Set<Integer> setA = new TreeSet<Integer>();
for (int i = 0; i < a + b; i++)
setA.add(sc.nextInt());
for (Integer i : setA)
System.out.print(i + " ");
}
}
}
哎!看看人家写的程序,我写的程序。没有对比就没有伤害啊!
这哥们的程序中用了Set集合下面的一个类TreeSet,我们来回顾 一下Set集合这个知识点吧!
Set集合下面有两个常用的类HashSet和TreeSet。
HashSet:
HashSet中存放的元素是无序不重复的。
哈希表里面存放的是哈希值hashcode。HashSet存储元素的顺序并不是按照存入时的顺序(和List显然不同) 是按照哈希值来存的,所以取数据也是按照哈希值取得。
HashSet使用hashcode和equals来判断集合中的元素是否重复。
HashSet首先判断两个元素的哈希值hashcode,如果哈希值一样,接着会比较equals方法 如果 equls结果为true ,HashSet就视为同一个元素。如果equals 为false就不是同一个元素。哈希值相同equals为false的元素是怎么存储呢,就是在同样的哈希值下顺延(可以认为哈希值相同的元素放在一个哈希桶中)。也就是哈希一样的存一列。
TreeSet:
存入TreeSet的元素具备比较性的。因为存入这个集合的类实现了Comparable 接口的compareTo 方法,所以我们若想要将一些类(例如自定义的Person类,Book类)存入TreeSet集合,就需要实现该接口,并重写该接口的compareTo方法,也就是要让自定义对象具备比较性.
当compareTo()函数返回值为0时,说明两个对象相等,此时该对象不会添加进来。
对了,题外话一句,Set集合一般使用迭代器迭代元素:
Set s = new HashSet();
hs.add("a");
hs.add("b");
hs.add("c");
hs.add("d");
Iterator it = s.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}