簡體   English   中英

如何在ArrayList中搜索相同的元素?

[英]how to search for the same element in an ArrayList?

此代碼創建50個1到100之間的隨機數,並將其添加到ArrayList中。 現在我想在ArrayList中搜索相同的數字,而不是刪除它們並獲得一個新數字。 最后,列表應該只包含50到1到100之間的唯一數字。

問題是:我不知道,如何在相同的ArrayList中搜索相同的數字,刪除它並獲得一個新的。 有人可以幫幫我嗎?

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

class RandomPrim {

    public static void main(String[] args) {

        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; counter++) {
            number = 1+nr.nextInt(100);
            liste.add(number);

            // System.out.println(liste.toString());
        }

        for (int ausgabe : liste) {
            System.out.print(ausgabe+ ", ");
        }
    }
}
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+ ", ");
}

希望這可以幫助。

最好更好地使用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 + ", ");
}

正如已經建議使用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需要迭代才能到達應該刪除的元素的索引。

您可以使用linq查詢:

liste.Distinct().ToArray();

這至少應該讓你朝着正確的方向前進。

如果你不想嘗試任何其他解決方案,你可以從頭開始獲取唯一的數字,同時仍然使用像這樣的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+ ", ");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM