JavaLinkedHashSet练习

题目三:
1.键盘录入一个字符串,去掉其中重复字符
2.打印出不同的那些字符,必须保证顺序。例如输入:aaaabbbcccddd,打印结果为:abcd。
尝试用两种方法解决字符串删除问题,一是使用HashSet元素的唯一性,直接过滤掉重复的字符,二是写一个方法逐步判断.
 1 import java.util.Iterator;
 2 import java.util.LinkedHashSet;
 3 
 4 /*
 5 * 三、根据需求完成代码
 6     1.键盘录入一个字符串,去掉其中重复字符
 7     2.打印出不同的那些字符,必须保证顺序。例如输入:aaaabbbcccddd,打印结果为:abcd。
 8     Time:2018-8-12 01:18:41 Author:ccsoftlucifer
 9 * */
10 public class MainClass {
11     public static void main(String[] args) {
12        String str = "aaaabbbcccddd";
13         //方案一:使用HashSet 自动过滤重复元素.
14         String s = chearCharMethod1(str);
15         System.out.println(s);
16         //方案二:自己写个方法过滤重复字符
17         System.out.println( chearCharMethod2(str));
18 
19     }
20     /*
21     * 方案一:直接使用HashSet过滤掉重复的元素.
22     * */
23     private static String chearCharMethod1(String string) {
24         char[] strToArrray = string.toCharArray();
25         LinkedHashSet<Character> c = new LinkedHashSet<>();
26         for (int i = 0; i < strToArrray.length; i++) {
27             c.add(strToArrray[i]);
28         }
29         String valueString="";
30         /*for (int i = 0; i < c.size(); i++) {
31             valueString+=
32         }*/
33         Iterator<Character> it = c.iterator();
34         while(it.hasNext())
35         {
36             Character next = it.next();
37             String string1 = next.toString();
38             valueString+=string1;
39         }
40 
41 
42         return valueString;
43     }
44     /*
45     *  使用数组的方式来删除字符串重重复的字符..
46     * */
47     private static String chearCharMethod2 (String string) {
48         String value="";
49         //字符串数组str1用来接受待处理的字符
50         char[] str1 = string.toCharArray();
51         //字符串数组str2用来接受处理好的字符
52         char str2 [] = new char[string.length()];
53         //str2的索引遍历初始值为k=0;
54         int k =0;
55 
56         //for循环去遍历str1字符数组,i指向当前位置,j指向下一个位置.
57         int i ,j;
58         for ( i = 0, j = 1; i < str1.length && j<str1.length ; i++,j++) {
59             //如果当前位置的元素 和 下一个元素的值相等 则跳过
60             //Test String:aaaabbbcccddd
61 
62             if(str1[i]==str1[j])
63             {
64                 //跳过不作处理
65 
66                 continue;
67             }
68             else
69             {
70                 //提取出不相等的
71                 str2[k]=str1[i];
72                 str2[k+1]=str1[i+1];
73                 //这里我对 str2 添加了两个元素,那么表面上是 k+=2 但是是不对的!
74                 //举个栗子:字符串 aabbcc ,第一次找到不相同的字符为 a,b 第二次找到不同的字符为b,c
75                 //那么str2的值为 a,b,b,c. 其中b重复了两次,明显是不对的.
76                 //可以尝试将第二次的b,c从a后开始追加,直接把b覆盖,就是a,b,c
77                 //将k+=2 改成 k++;
78                 k++;
79             }
80         }
81         for (int index = 0; index < str2.length; index++) {
82 
83             //System.out.println(str2[index]+" ");
84             value+=str2[index];
85         }
86         return value;
87     }
88 
89 }
运行结果:



1.产生10个1-20之间的随机数要求随机数不能重复
2.产生10个长度为10的不能重复的字符串(里面只能出现大写字母、小写字母、0-9的数字),并遍历打印输出
 1 import java.util.LinkedHashSet;
 2 import java.util.Random;
 3 import java.util.Scanner;
 4 
 5 /*
 6 *   1.产生10个1-20之间的随机数要求随机数不能重复
 7     2.产生10个长度为10的不能重复的字符串(里面只能出现大写字母、小写字母、0-9的数字),并遍历打印输出
 8 * */
 9 public class Topic2 {
10     public static void main(String[] args) {
11        // method1();
12         method2();
13         method3();
14 
15 
16     }
17     /* 调用字符串产生方法makeArray(),将字符串添加到LinkedHashSet集合中,LinkedhashSet会自动的对
18     *  重复元素进行处理.
19     * */
20     private static void method3() {
21       LinkedHashSet<String> set = new LinkedHashSet<>();
22       while(set.size()<10)
23       {
24           set.add(makeArray());
25 
26       }
27         System.out.println(set);
28 
29     }
30     /*产生长度为10的不能重复的字符串(里面只能出现大写字母、小写字母、0-9的数字)*/
31     private static String makeArray(){
32         String strValue = "";
33         //1.先创建一个字符数组,题目要求长度为10,即是字符数组的上限为10
34         char array[] = new char[10];
35         //2.随机生成 一个flag标记值,用来随机生成 小写字母 大写字母 数字
36         Random ra = new Random();
37         for (int i = 0; i < array.length; i++) {
38             //获得flag标记值
39             //flag为 0 标记 整数
40             //flag为 1 标记 小写字母
41             //flag为 2 标记 大写字母
42 
43            int flag = ra.nextInt(3);
44             if (flag == 0)
45             {
46                 int zhengshu = new Random().nextInt(10);
47                 array[i]=(char)(48+zhengshu);
48 
49             }
50             else if (flag ==1){
51                 int xiaoxie = new Random().nextInt(26);
52                 array[i]=(char)('a'+xiaoxie);
53             }
54             else
55             {
56                 int daxie = new Random().nextInt(26);
57                 array[i]=(char)('A'+daxie);
58             }
59         }
60         for (int i = 0; i < array.length; i++) {
61             strValue+=array[i];
62         }
63         return strValue;
64     }
65     //1.产生10个1-20之间的随机数要求随机数不能重复
66     private static void method2() {
67         LinkedHashSet<Integer> set = new LinkedHashSet<>();
68         //产生随机数字,
69         Random ra = new Random();
70         int temp=0;
71         //将随机数组添加到set集合当中,set集合会自动的筛出重复的元素
72 
73         //添加结束标志为 检测到set集合的size为10
74         while(set.size()<10){
75             temp=ra.nextInt(20)+1;
76             set.add(temp);
77 
78         }
79         System.out.println(set);
80 
81     }
运行结果:




原文地址:https://www.cnblogs.com/battlecry/p/9461836.html