此代码创建50个1到100之间的随机数,并将其添加到ArrayList中。 现在我想在ArrayList中搜索相同的数字,而不是删除它们并获得一个新数字。 最后,列表应该只包含50到1到100之间的唯一数字。
问题是:我不知道,如何在相同的ArrayList中搜索相同的数字,删除它并获得一个新的。 有人可以帮帮我吗?
section
答案 0 :(得分:3)
Random nr = new Random();
int number;
ArrayList<Integer> liste = new ArrayList<Integer>();
// get 50 random numbers between 1 and 100
for(int counter = 1; counter <= 50; ) {
number = 1+nr.nextInt(100);
if(!(liste.contains(number))) {
liste.add(number);
counter++;
}
}
for (int ausgabe : liste) {
System.out.print(ausgabe+ ", ");
}
希望这会有所帮助。
答案 1 :(得分:2)
更好地使用HashSet,以避免重复:
Random nr = new Random();
int number;
Set<Integer> randomSet = new HashSet<>();
// get 50 random numbers between 1 and 100
while(randomSet.size() < 50) {
number = 1 + nr.nextInt(100);
randomSet.add(number);
}
for (int ausgabe : randomSet) {
System.out.print(ausgabe + ", ");
}
答案 2 :(得分:2)
正如已经建议使用Set
或者,如果插入顺序很重要,则LinkedHashSet
并保持生成随机数,直到该集合的大小为50。
然而,问题可能在于,当设置填满时,您可能会获得越来越多的重复,因此需要大量重试。
所以另一种选择可能是使用100个数字的列表,然后随机取出一个数字:
List<Integer> availableNumbers = new ArrayList<>( 100 );
for( int i = 1; i <= 100; i++ ) {
availableNumbers.add( i );
}
Random r = new Random();
List<Integer> randomizedList = new ArrayList<>( 50 );
for( int i = 0; i < 50; i++ ) {
int randomIndex = r.nextInt( availableNumbers.size() );
randomizedList.add( availableNumbers.remove( randomIndex ) );
}
请注意,使用ArrayList
的缺点是,如果您取出一个数字,则必须将其后面的所有数字移到左侧。另一方面,使用LinkedList
需要迭代才能到达应该删除的元素的索引。
答案 3 :(得分:1)
您可以使用linq查询:
liste.Distinct().ToArray();
至少应该让你朝着正确的方向前进。
答案 4 :(得分:1)
如果您不想尝试任何其他解决方案,您可以从头开始获取唯一数字,同时仍然使用像这样的ArrayList ..
Random nr = new Random();
int number;
ArrayList<Integer> liste = new ArrayList<Integer>();
// get 50 random numbers between 1 and 100
for(int counter = 1; counter <= 50; ) {
number = 1+nr.nextInt(100);
if(!(liste.contains(number))) {
liste.add(number);
counter++;
}
else {
counter = counter - 1;
}
}
for (int ausgabe : liste) {
System.out.print(ausgabe+ ", ");
}