简体   繁体   English

检查号码是否已经存在

[英]Checking if number already exists

I am generating a random number between 40 and 50. Once the number is generated I print it to the screen and I add it to a ArrayList . 我正在生成一个40到50之间的随机数。生成该数字后,将其打印到屏幕上,然后将其添加到ArrayList However if the number already exists in the ArrayList then I print a message "This number already exists in Array List" . 但是,如果该数字已存在于ArrayList那么我将显示一条消息"This number already exists in Array List" So the code should never print the same number twice. 因此,该代码永远不应打印两次相同的数字。 However for some reason it keeps printing the same number twice even when it exists in the array list. 但是由于某种原因,即使数组列表中存在相同的数字,它也会打印两次相同的数字。 I'm not sure what I am doing wrong here 我不确定我在做什么错

import java.util.ArrayList;
import java.util.Random; 

public class RandomNumber {

    Random random = new Random(); 
    int x;
    int l;
    public static void main(String[] args) {
        RandomNumber r = new RandomNumber();
        r.genNumber(50,40);
    }

    public void genNumber(int high, int low) {
        x = random.nextInt(high-low)+low;
        ArrayList<Integer> arl = new ArrayList<Integer>();


        if(!arl.contains(x)) {
            System.out.println(x);
            arl.add(x);

        } else if (arl.contains(x)) {
            System.out.println("This is already in ArrayList");
        }
    }
}

The logic in your code is broken. 代码中的逻辑已损坏。

First, when you check if(!arl.contains(x)) , arl is empty, so this condition is always true. 首先,当您检查if(!arl.contains(x))arl为空,因此此条件始终为true。

More importantly, if you want to maintain just unique numbers, use a Set instead of a List . 更重要的是,如果您只想维护唯一数字,请使用Set而不是List And this set should be global , ie, declared outside the genNumber method. 并且此集合应该是global ,即在genNumber方法外部声明。 The code below should work (untested, and I kept your original data structures). 下面的代码应该可以工作(未经测试,我保留了原始数据结构)。

import java.util.ArrayList;
import java.util.Random; 

public class RandomNumber {

    Random random = new Random(); 
    int x;
    int l;
    ArrayList<Integer> arl;

    public RandomNumber() {
        arl = new ArrayList<>();
    }

    public static void main(String[] args) {
        RandomNumber r = new RandomNumber();
        r.genNumber(50,40);
    }

    public void genNumber(int high, int low){
        x = random.nextInt(high-low)+low;
        if(!arl.contains(x)) {
            System.out.println(x);
            arl.add(x);
        } else {
            System.out.println("This is already in ArrayList");
        }
    }
}

You need to make the ArrayList a field, instead of a local variable. 您需要使ArrayList成为一个字段,而不是局部变量。 This way it can be reused between method calls (as long as you use the same instance of RandomNumber). 这样,可以在方法调用之间重用它(只要您使用相同的RandomNumber实例)。 In your current implementation, the ArrayList that keeps track of already generated numbers is thrown away at the end of the method. 在您当前的实现中,跟踪已生成数字的ArrayList在方法末尾被丢弃。

This works: 这有效:

import java.util.ArrayList;
import java.util.Random;

public class RandomNumber {

    Random random = new Random();
    int x;
    int l;
    ArrayList<Integer> arl = new ArrayList<Integer>();

    public static void main(String[] args) {
        RandomNumber r = new RandomNumber();
        r.genNumber(50,40);
        r.genNumber(50,40);
        r.genNumber(50,40);
        r.genNumber(50,40);
        r.genNumber(50,40);
        r.genNumber(50,40);
        r.genNumber(50,40);
        r.genNumber(50,40);

        //r = new RandomNumber(); // created a new one - uncommenting this line will mean the List is lost and we will generate duplicates.
        r.genNumber(50,40);
        r.genNumber(50,40);
        r.genNumber(50,40);
        r.genNumber(50,40);
        r.genNumber(50,40);
        r.genNumber(50,40);
    }

    public void genNumber(int high, int low){
        x = random.nextInt(high-low)+low;

        if(!arl.contains(x)){
            System.out.println(x);
            arl.add(x);

        }else if(arl.contains(x)){
            System.out.println("This is already in ArrayList");
        }
    }
}

Actually I think you're misunderstanding the error. 实际上,我认为您误会了错误。 You are making a brand new ArrayList every time you call your method, so it always starts out empty. 每次调用您的方法时,您都在创建一个全新的ArrayList,因此它始终以空开头。 So, no problem adding the random number to it. 因此,向其添加随机数没有问题。

To fix, you'll want to move your arl out of that method so that it is created once and lives on until your app is done (or until you're done storing random numbers). 要解决此问题,您需要将arl移出该方法,以便仅创建一次即可继续使用,直到应用程序完成(或直到您完成存储随机数)为止。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM