Java核心语法练习题——集合练习题(一)

关于集合的练习题

一、随机录入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 + "]";
	}

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈年_H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值