如何简化Java代码中while循环与数组的重复值比较逻辑?
如何简化Java中判断随机数是否与数组元素重复的冗长逻辑?
你遇到的这个问题太常见了——手动逐个比对数组元素不仅代码写得又长又啰嗦,还藏着个小bug呢:比如第一次循环i=0的时候,数组里还没赋值的元素都是默认的0,这时候要是随机生成的数刚好是0,直接就陷入无限循环了!下面给你几个简洁又靠谱的优化方案:
方案1:只遍历已填充的数组元素(最直接的修改)
在循环的第i次迭代时,只有数组的前i个元素(索引0到i-1)是已经生成的有效随机数,后面的元素都是默认值,完全没必要去比对。我们可以把判断逻辑改成只检查已经填充过的部分:
int[] numbers = new int[7]; Random rand = new Random(); for(int i = 0; i < 7; i++) { int number = rand.nextInt(46); boolean isDuplicate; do { isDuplicate = false; // 仅遍历已赋值的前i个元素 for (int j = 0; j < i; j++) { if (number == numbers[j]) { isDuplicate = true; number = rand.nextInt(46); // 生成新的随机数 break; } } } while(isDuplicate); numbers[i] = number; } // 输出结果 for(int num : numbers) { System.out.println(num); }
这种写法既简化了判断逻辑,还顺便修复了原代码里误判未赋值元素的bug。
方案2:利用Set集合自动去重(更高效简洁)
Set的核心特性就是不允许重复元素,用它来存已经生成的随机数,判断重复只需要调用contains()方法就行,代码会清爽很多,而且时间效率更高(Set的contains操作平均是O(1),数组遍历是O(n)):
Set<Integer> numberSet = new HashSet<>(); Random rand = new Random(); // 直到Set里凑够7个不重复的数 while(numberSet.size() < 7) { numberSet.add(rand.nextInt(46)); } // 如果需要转成int数组的话 int[] numbers = numberSet.stream().mapToInt(Integer::intValue).toArray(); // 输出结果 for(int num : numbers) { System.out.println(num); }
这种写法完全省去了手动判断重复的逻辑,可读性和维护性都拉满。
方案3:用Arrays工具类简化判断(注意基本类型的坑)
如果坚持要用数组来实现,也可以把已填充的数组部分转成列表后用contains()方法,但要注意:Arrays.asList()不支持基本类型数组(int[]会被当成一个单独的元素),所以得先转成Integer数组或者用流处理:
int[] numbers = new int[7]; Random rand = new Random(); for(int i = 0; i < 7; i++) { int number = rand.nextInt(46); // 把已填充的元素转成Integer列表 List<Integer> existingNums = Arrays.stream(numbers, 0, i).boxed().toList(); while(existingNums.contains(number)) { number = rand.nextInt(46); } numbers[i] = number; } // 输出结果 for(int num : numbers) { System.out.println(num); }
这种方法代码也比较简洁,但效率比Set方案略低,适合元素数量不多的场景。
内容的提问来源于stack exchange,提问作者1950
相关产品推荐
相关产品推荐

