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 }
运行结果: