生成一个数字并检查它是否已经在 ArrayList 中
Generate a number and check if it is already in a ArrayList
我想生成 10 个随机数。但是在我向 ArrayList 添加一个数字之前,我需要检查我的 Arraylist 是否已经包含一个在 randomNumber - 50
和 randomNumber + 50
之间的数字。
例如随机数为120:
120-50=70
120+50=170
如果 ArrayList 包含一个介于 70 和 170 之间的数字,我不会将它添加到我的 ArrayList 并且 运行 再次循环...
我的代码有什么问题?
package ee.tlu;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Testing {
public Testing() {
List < Integer > numbers = new ArrayList < > ();
Random rand = new Random();
int number = rand.nextInt(5000);
int n = 0;
boolean listis = false;
numbers.add(number);
while (n < 10) {
number = rand.nextInt(5000);
for (int k = number - 50; k < number + 50; k++) {
if (numbers.contains(k)) {
listis = true;
break;
}
}
if (!listis) {
numbers.add(number);
n += 1;
}
}
System.out.println(numbers);
}
public static void main(String[] args) {
new Testing();
}
}
我不确定这是否是唯一的问题,但您应该在 while 循环的每次迭代中重置 listis
标志:
while (n < 10) {
listis = false; // added
number = rand.nextInt(5000);
for (int k = number - 50; k < number + 50; k++) {
if (numbers.contains(k)) {
listis = true;
break;
}
}
if (!listis) {
numbers.add(number);
n += 1;
}
}
否则,第一次发现不应该相加的数字时,将停止相加。
您在开始 while 循环之前声明 listis
。一旦设置为 true,它就永远不会重置。将其移动到循环内。
此外,您永远不会检查 number + 50
,因为您在 for 循环中使用 <
而不是 <=
。
while (n < 10) {
boolean listis = false;
number = rand.nextInt(5000);
for (int k = number - 50; k <= number + 50; k++) {
if (numbers.contains(k)) {
listis = true;
break;
}
}
if (!listis) {
numbers.add(number);
n += 1;
}
}
I would do this recursively. I haven't tested the below code, just a quick mockup on notepad. But hopefully this will help.
public class Testing {
public List < Integer > numbers = new ArrayList < > ();
public Testing() {
Random rand = new Random();
int number = rand.nextInt(5000);
// initial number in arraylist
numbers.add(number);
// add 9 more numbers to arraylist
addNumbers(9);
System.out.println(numbers);
}
public void addNumber(int amountLeft){
int newNumber = rand.nextInt(5000);
if(isValidNumberToAdd(newNumber))
{
numbers.add(newNumber);
}
if(amountLeft == 0)
{
return;
}
addNumber(amountLeft--);
}
public boolean isValidNumberToAdd(int newNumber)
{
Iterator<int> numbersIterator = numbers.iterator();
while (numbersIterator.hasNext()) {
int number = numbersIterator.next();
if(newNumber > number - 50 && newNumber < number + 50)
{
return false;
}
}
return true;
}
public static void main(String[] args) {
new Testing();
}
}
只需使用 Set 而不是 List。套装保证:
Adding new element to the set works only if new element is not already present in the set.
我想生成 10 个随机数。但是在我向 ArrayList 添加一个数字之前,我需要检查我的 Arraylist 是否已经包含一个在 randomNumber - 50
和 randomNumber + 50
之间的数字。
例如随机数为120:
120-50=70
120+50=170
如果 ArrayList 包含一个介于 70 和 170 之间的数字,我不会将它添加到我的 ArrayList 并且 运行 再次循环...
我的代码有什么问题?
package ee.tlu;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Testing {
public Testing() {
List < Integer > numbers = new ArrayList < > ();
Random rand = new Random();
int number = rand.nextInt(5000);
int n = 0;
boolean listis = false;
numbers.add(number);
while (n < 10) {
number = rand.nextInt(5000);
for (int k = number - 50; k < number + 50; k++) {
if (numbers.contains(k)) {
listis = true;
break;
}
}
if (!listis) {
numbers.add(number);
n += 1;
}
}
System.out.println(numbers);
}
public static void main(String[] args) {
new Testing();
}
}
我不确定这是否是唯一的问题,但您应该在 while 循环的每次迭代中重置 listis
标志:
while (n < 10) {
listis = false; // added
number = rand.nextInt(5000);
for (int k = number - 50; k < number + 50; k++) {
if (numbers.contains(k)) {
listis = true;
break;
}
}
if (!listis) {
numbers.add(number);
n += 1;
}
}
否则,第一次发现不应该相加的数字时,将停止相加。
您在开始 while 循环之前声明 listis
。一旦设置为 true,它就永远不会重置。将其移动到循环内。
此外,您永远不会检查 number + 50
,因为您在 for 循环中使用 <
而不是 <=
。
while (n < 10) {
boolean listis = false;
number = rand.nextInt(5000);
for (int k = number - 50; k <= number + 50; k++) {
if (numbers.contains(k)) {
listis = true;
break;
}
}
if (!listis) {
numbers.add(number);
n += 1;
}
}
I would do this recursively. I haven't tested the below code, just a quick mockup on notepad. But hopefully this will help.
public class Testing {
public List < Integer > numbers = new ArrayList < > ();
public Testing() {
Random rand = new Random();
int number = rand.nextInt(5000);
// initial number in arraylist
numbers.add(number);
// add 9 more numbers to arraylist
addNumbers(9);
System.out.println(numbers);
}
public void addNumber(int amountLeft){
int newNumber = rand.nextInt(5000);
if(isValidNumberToAdd(newNumber))
{
numbers.add(newNumber);
}
if(amountLeft == 0)
{
return;
}
addNumber(amountLeft--);
}
public boolean isValidNumberToAdd(int newNumber)
{
Iterator<int> numbersIterator = numbers.iterator();
while (numbersIterator.hasNext()) {
int number = numbersIterator.next();
if(newNumber > number - 50 && newNumber < number + 50)
{
return false;
}
}
return true;
}
public static void main(String[] args) {
new Testing();
}
}
只需使用 Set 而不是 List。套装保证: Adding new element to the set works only if new element is not already present in the set.