【问题标题】:Java - Improper Checking in For LoopJava - For 循环中的不正确检查
【发布时间】:2016-05-11 06:49:39
【问题描述】:

这是 Java 中的一段代码,我正在尝试从任务数组中输出随机数,并确保没有重复输出,我将它们置于其他一些循环中(假设你有第六个,随机选择的任务“task[5]”;它通过 for 循环检查每个“tCheck”元素,而 task[5] 等于 tCheck 元素之一,它会继续尝试在之前找到另一个选项回到检查 forloop 的开头... tCheck[i] 元素在每个整体输出循环结束时更改为为任务元素确定的新随机数)。

问题是,尽管据说会针对所有 tCheck 元素检查每个新的随机任务,但有时(并非总是)有重复的任务输出(意思是说,而不是输出 2、3、6、1、8、7, 5,4,它会输出类似 2,3,2,1,8,7,5,4 的东西,其中“2”被重复......并不总是在同一个地方,这意味着它有时会像这样结束,同样,其中“4”重复:3,1,4,5,4,6,7,8)

int num = console.nextInt();                                
String[] tasks = {"1","2","3","4","5","6","7","8"};
String[] tCheck = {"","","","","","","",""};
for(int i = 0; i<= (num-1); i++){
    int tNum = rand.nextInt(8);
    for(int j = 0; j <=7; j++){
        if(tasks[tNum].equals(tCheck[j])){
            while(tasks[tNum].equals(tCheck[j])){
                tNum = rand.nextInt(8);
            }
            j = 0;
        }
    }
    tCheck[i] = tasks[tNum];
    System.out.println(tasks[tNum]+" & "+tCheck[i]);
}

其他代码块都不会影响这部分(除了设置 Random int's、Scanners 等;这些都正确完成)。我只想让它随机打印出每个数字,而且只打印一次。永远不会有任何重复。我如何让它做到这一点?

提前致谢。

【问题讨论】:

  • 为什么不使用 List 和 contains 方法
  • 为什么不将新号码插入HashSet 而不是所有这些循环?每次生成一个新的时,您只需检查它是否已经存在于O(1) 时间的HashSet 中,如果存在,您可以忽略它并生成一个新的。
  • 要回答所有“你为什么不是 ___”的问题,我是 Java 新手,我从来没有听说过你们刚才说的那些话。
  • @Ray25Lee HashSet 是一个 Set,基本上包含独特的元素。当您插入一个新元素时,该类负责所有检查以确定该元素是否存在,换句话说,HashSet 不能 包含重复项。通过使用这种数据结构,您可以将所有循环转换为一个单独的 if 语句,用于检查 HashSet 是否包含元素。

标签: java loops for-loop while-loop


【解决方案1】:

首先,不要使用数组。使用集合 - 它们对程序员更友好。
其次,使用JDK的API来实现这个思路:

  • 随机排列元素的顺序
  • 然后线性迭代它们

在代码中:

List<String> tasks = Arrays.asList("1","2","3","4","5","6","7","8");
Collections.shuffle(tasks);
tasks.forEach(System.out::println);

工作完成。

【讨论】:

  • 这看起来非常有用;我试着把它放到一个测试程序中,“::”部分阻止它编译(我以前从未见过这种类型的格式,我不知道如何修复它)。
  • @Ray25Lee 这只是一个随意的 for 循环,但它使用 java 8 中包含的 lambda 方式编写它。如果你不使用java 8,你可以简单地将其重写为普通的for(String s : tasks)....
  • 在 Java 8 中使用 Lamba 很好,我一直忘记它们! @Ray25Lee,检查你的 Java 版本。
  • @Ray 如果您不使用 java 8,请改用for (String task : tasks) System.out.println(task);
  • 有效!多谢你们。这是一个很棒的方法(你说得对,更简单)。
【解决方案2】:

您可以使用这种方法检查某个值是否在您的数组中。

   for(int i = 0; i<= (num-1); i++){
    int tNum = rand.nextInt(8);
     boolean exist =   Arrays.asList(tasks).contains(tNum);
      while(!exist){
     //your code
     int tNum = rand.nextInt(8);
    exist =   Arrays.asList(tasks).contains(tNum);
  }       
}

如果您使用的是arraylist,那么您可以使用contains 方法检查它,因为您使用的是array,我们必须使用asList() 从数组中获取list,然后使用@987654327 @ 方法。在 while 循环的帮助下,它将继续生成 random 数字,直到它生成一个不重复的值。

【讨论】:

  • 这对于大型列表来说确实很昂贵。 包含 列表中的循环,直到它找到值或到达末尾,这可能非常快。
【解决方案3】:

我曾经使用 ArrayList 创建过类似的东西

public class Main {
    public static void main(String[] args) {

        String[] array = { "a", "b", "c", "d", "e" };
        List<String> l = new ArrayList<String>(Arrays.asList(array));
        Random r = new Random();
        while(!l.isEmpty()){
            String s = l.remove(r.nextInt(l.size()));
            System.out.println(s);
        }
    }
}

我删除列表中的一个随机位置,直到它为空。我不使用任何内容检查。我相信这很有效(即使我创建了一个列表)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    相关资源
    最近更新 更多