检查号码是否已存在

时间:2015-08-03 21:54:26

标签: java

我生成一个40到50之间的随机数。生成数字后,我将其打印到屏幕上,然后将其添加到ArrayList。但是,如果ArrayList中已存在该号码,则会打印一条消息"This number already exists in Array List"。所以代码永远不应该打印两次相同的数字。但是由于某些原因,即使数组列表中存在相同的数字,它也会保持两次打印相同的数字。我不确定我在这里做错了什么

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");
        }
    }
}

3 个答案:

答案 0 :(得分:2)

代码中的逻辑被破坏了。

首先,当您检查if(!arl.contains(x))时,arl为空,因此此条件始终为真。

更重要的是,如果您只想维护唯一的数字,请使用Set代替List。此集应该是全局,即在genNumber方法之外声明。下面的代码应该有效(未经测试,我保留了原始数据结构)。

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");
        }
    }
}

答案 1 :(得分:1)

您需要将ArrayList设为字段,而不是局部变量。这样它就可以在方法调用之间重用(只要你使用相同的RandomNumber实例)。在您当前的实现中,跟踪已生成的数字的ArrayList在方法结束时被丢弃。

这有效:

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");
        }
    }
}

答案 2 :(得分:-1)

实际上我认为你误解了这个错误。每次调用方法时,您都会创建一个全新的ArrayList,因此它始终为空。所以,添加随机数没问题。

要修复,你需要将你的arl移出该方法,以便创建一次并继续使用直到你的应用程序完成(或直到你完成存储随机数字)。