关于集合的练习题
一、随机录入10个不重复的数字并排序
(1)生成10个1至100之间的随机整数(不能重复),存入一个List集合
(2)编写方法对List集合进行排序
(3)然后利用迭代器遍历集合元素并输出
解法:
①set存储(双列集合map也可以),保证唯一性;collections工具类的sort方法排序,注意需要使用list集合
②直接list存储,使用集合的contians方法保证唯一性;Arrays工具类的sort方法排序,但是Arrays工具类的sort方法,要求是int类型的数组,需要先将集合转为int类型的数组
public class demo_随机录入不重复的数字并排序 {
public static void main(String[] args) {
Set<Integer> set = new HashSet<Integer>();
//生成10个随机数
while(true) {
double ran = Math.random();
int random = (int)(ran*100) + 1;
set.add(random);
if(set.size() == 10)
break;
}
sort(set);
}
//排序,并打印
private static void sort(Set<Integer> set) {
List<Integer> list = new ArrayList<Integer>();
list.addAll(set);
Collections.sort(list);
for (Integer integer : list) {
System.out.print(integer + "\t");
}
}
}
自己设置排序,去重也欧克
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
// 生成10个不同的随机数。可以使用Collection自带的contains()方法
int ran = (int) (Math.random() * 100) + 1;
list.add(0, ran);// 初始化list
for (int i = 0; i < 9; i++) {// 正要添加的数
ran = (int) (Math.random() * 100) + 1;
for (int j = 0; j < i; j++) {// 表示已添加的数
if (ran == list.get(j)) {// 如果重复,重新生成,并再次比较
ran = (int) (Math.random() * 100) + 1;
j = -1;// 需要与j之前的,在次比较,因为上一个与j之前的不同,但是当前随机数不一定
}
}
list.add(ran);
}
System.out.println(list);
// 升序排序
change1(list);
// 迭代器遍历
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
System.out.print(it.next() + " ");
}
}
// 升序排列1。可以使用Arrays工具类自带的sort()
public static void change1(List<Integer> list) {
int tmp;
for (int i = 0; i < list.size(); i++) {
for (int j = i + 1; j < list.size(); j++) {
if (list.get(i) > list.get(j)) {
tmp = list.get(j);
list.add(j, list.get(i));
list.remove(j + 1);// 将原本j位置的数删除(被顶到j+1位置了)
list.add(i, tmp);
list.remove(i + 1);
}
}
}
}
// 升序排列2
// public static void change2(List<Integer> list) {
// Object[] obj = list.toArray();
Arrays.sort(obj);
// Object tmp = 0;
// for (int i = 0; i < obj.length ; i++) {
// for (int j = i+1; j < obj.length; j++) {
// if((int)obj[i] > (int)obj[j]) {//
// tmp = obj[j];
// obj[j] = obj[i];
// obj[i] = tmp;
//
// }
// }
// }
//
// list.clear();
//
// for (int i = 0; i < obj.length; i++) {
// list.add((Integer) obj[i]);
// }
//
// }
}
二、键盘录入一个字符串,输出其中的字符,相同字符只输出一次,要求保证原录入顺序
@SuppressWarnings("resource")
public static void main(String[] args) {
List<Character> list = new ArrayList<Character>();
Scanner sc = new Scanner(System.in);
System.out.print("请输入一个字符串:\t");
String str = sc.next();
char[] ch = str.toCharArray();
for (int i = 0; i < ch.length; i++) {
list.add(ch[i]);
}
LinkedHashSet<Character> lhs = new LinkedHashSet<Character>(list);
System.out.print("去重结果为:\t");
System.out.println(lhs);
}
三、统计字符个数
(1)利用键盘录入,输入一个字符串
(2)统计该字符串中各个字符的数量
(3)如:用户输入字符串"Ifyou-wanttochange-your_fate_I_thinkyoumustcome-to-the-ujiuye-to-learn-java"
程序输出结果:-(9)I(2)_(3)a(7)c(2)d(1)…
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入带统计个数的字符串:");
String str = sc.next();
//方法二
test2_map_一列存值一列统计个数(str);
//方法一
test1_单列集合(str);
}
private static void test2_map_一列存值一列统计个数(String str) {
char[] ch = str.toCharArray();
Map<Character, Integer> map = new LinkedHashMap<>();
for (char c : ch) {
// if(!map.containsKey(c)) {
// map.put(c, 1);
// }else {
// map.put(c, map.get(c) + 1);
// }
map.put(c, map.containsKey(c) ? map.get(c) + 1 : 1);
}
StringBuilder sb = new StringBuilder();
for (Map.Entry<Character, Integer> entry : map.entrySet()) {
sb.append(entry.getKey()).append("(").append(entry.getValue()).append(")");
}
System.out.println(sb);
}
private static void test1_单列集合(String str) {
// 字符串转集合
char[] ch = str.toCharArray();
List<Character> list = new ArrayList<>();
for (int i = 0; i < ch.length; i++) {
list.add(ch[i]);
}
// 去重,用于显示和统计个数
LinkedHashSet<Character> chch = new LinkedHashSet<Character>(list);
int count = 0;
for (Character character : chch) {
count = Collections.frequency(list, character);
System.out.print(character + "(" + count + ")");
}
}
四、 自定义方法实现LinkedList的去重功能,并保证顺序不变
public static void main(String[] args) {
String[] arr = { "123", "abc", "123", "abc", "erq", "***", "erq" };
linked(arr);
System.out.println();
Integer[] arr2 = { 1, 2, 3, 5, 1, 2, 3 };
linked(arr2);
}
public static <T> void linked(T[] arr) {
List<T> lhs = new ArrayList<T>();
for (int i = 0; i < arr.length; i++) {
lhs.add(arr[i]);
}
System.out.println(lhs);
// 复制一个list,用于做判断
List<T> list = new ArrayList<T>();
list.addAll(lhs);
//将原来的内容删除,用来装去重后的结果
lhs.clear();
for (T str : list) {
if (!lhs.contains(str)) {
lhs.add(str);
}
}
System.out.println(lhs);
}
五、 Map集合中自定义类的遍历
(1)定义一个学生类Student,包含属性:姓名(String name)、年龄(int age)
(2)定义Map集合,用Student对象作为key,用字符串(此表示表示学生的住址)作为value
(3)利用四种方式遍历Map集合中的内容
public class homework01 {
public static void main(String[] args) {
Map<Student, String> map = new HashMap<>();
map.put(new Student("张三", 12), "123");
map.put(new Student("李四", 18), "123");
map.put(new Student("王五", 16), "123");
map.put(new Student("赵六", 17), "123");
test_迭代器_key(map);
System.out.println();
test_fore_key(map);
System.out.println();
test_迭代器_Entry(map);
System.out.println();
test_fore_Entry(map);
}
private static void test_迭代器_key(Map<Student, String> map) {
Set<Student> keys = map.keySet();
Iterator<Student> it = keys.iterator();
while (it.hasNext()) {
Student student = it.next();
String value = map.get(student);
System.out.println("key:" + student + "value:" + value);
}
}
private static void test_fore_key(Map<Student, String> map) {
Set<Student> keys = map.keySet();
for (Student student : keys) {
System.out.println("key:" + student + "value:" + map.get(student));
}
}
private static void test_迭代器_Entry(Map<Student, String> map) {
Set<Map.Entry<Student, String>> entrys = map.entrySet();
Iterator<Map.Entry<Student, String>> it = entrys.iterator();
while (it.hasNext()) {
Map.Entry<Student, String> entry = it.next();
Student key = entry.getKey();
String value = entry.getValue();
System.out.println("key:" + key + "value:" + value);
}
}
private static void test_fore_Entry(Map<Student, String> map) {
for (Map.Entry<Student, String> entry : map.entrySet()) {
System.out.println("key:" + entry.getKey() + "value:" + entry.getValue());
}
}
}
class Student {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
……
省略get、set方法
……
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}