簡體   English   中英

生成特定的隨機字符串數組

[英]Generating specific random string arrays

我知道,標題似乎有些奇怪,請讓我解釋一下。

我想生成隨機字符串數組,該數組必須由特定的給定元素組成。

假設這些元素是:面包,牛奶,谷物和咖啡。

Java代碼應隨機選擇其中之一並將其放入數組中。

我取得了一些進展,並設法用以下代碼生成了10個數組,例如:

    String[] elements = new String[] {"Bread","Milk","Cereal","Coffee"};

    for (int i=0; i < 10; i++) {

        int random_number = ThreadLocalRandom.current().nextInt(2, 5);

        String[] list = new String[random_number];

        System.out.print("[");

        for (int j=0; j < random_number; j++) {

            int pos = ThreadLocalRandom.current().nextInt(0, 4);
            list[j] = elements[pos];
            System.out.print(list[j]+ ", ");
        }

        System.out.println("]");
        }

一個可能的輸出如下所示:

[Coffee, Coffee, Coffee, Bread, ]
[Bread, Bread, Coffee, ]
[Coffee, Coffee, Cereal, ]
[Milk, Cereal, ]
[Cereal, Coffee, ]
[Coffee, Cereal, Bread, ]
[Cereal, Cereal, Milk, Milk, ]
[Milk, Bread, Milk, ]
[Bread, Coffee, ]
[Coffee, Bread, ]

有兩個問題。

首先是不是很重要,但將是很好不具有,每個數組的最后一個元素之后。

第二個主要問題是:我不希望每個數組中都有重復的元素。

面包,牛奶,谷物,咖啡在每個陣列中的顯示不得超過一次。

因此,例如[Coffee, Coffee, Coffee, Bread]是錯誤的。

換句話說,一種可能的正確輸出將是:

[Bread, Milk]
[Bread, Milk, Cereal, Coffee]
[Bread, Cereal, Coffee]
[Bread, Cereal]
[Bread, Coffee]
[Milk, Coffee]
[Milk, Cereal]
[Milk, Cereal, Coffee]
[Cereal, Coffee]

如果兩個或多個數組相同,則很好。

提前致謝。

創建一個包含您的4個元素的列表。 隨機播放。 選擇一個介於0和4之間的隨機整數。以從0開始到此隨機索引結束的子列表。 打印列表。 重復多次。

您可以像這樣使用SetRandom

String[] elements = new String[] {"Bread","Milk","Cereal","Coffee"};
Random r = new Random();
for(int i=0;i<10;i++)
    Set<String> set = new HashSet<>();
    for (int j=0; j < 4; j++) {
       set.add(elements[r.nextInt(4)]);
    }
    System.out.println(set);
}

首先,數組中的不會來自System.out.print(list[j]+ ", "); ,它與數組無關。

為了避免重復,請替換String array String[] list = new String[random_number]; 帶有Set Set<String> set = new HashSet();

如果您不太關心效率,這將是一種方法

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class RandomArrays {
    public static void main(String[] args) {
        String[] elements = new String[]{"Bread", "Milk", "Cereal", "Coffee"};
        for (int i = 0; i < 15; i++) {
            final String[] array = generateRandomArrayFromElements(elements);
            System.out.println(Arrays.toString(array));
        }
    }

    private static String[] generateRandomArrayFromElements(String[] elements) {
        final List<String> list = Arrays.asList(elements);
        Collections.shuffle(list);
        return list.toArray(new String[list.size()]);
    }
}

或者,如果您需要可變數量的元素,則可以執行以下操作:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.concurrent.ThreadLocalRandom;

public class RandomArrays {
    public static void main(String[] args) {
        String[] elements = new String[]{"Bread", "Milk", "Cereal", "Coffee"};
        for (int i = 0; i < 15; i++) {
            final String[] array = generateRandomArrayFromElements(elements);
            System.out.println(Arrays.toString(array));
        }
    }

    private static String[] generateRandomArrayFromElements(String[] elements) {
        int size = ThreadLocalRandom.current().nextInt(0, elements.length) + 1;
        String[] array = new String[size];
        ArrayList<Integer> usedIndices = new ArrayList<>(size);
        for (int i = 0; i < array.length; i++) {
            int randomIndex = getUniqueRandomIndex(usedIndices, size);
            usedIndices.add(randomIndex);
            array[i] = elements[randomIndex];
        }
        return array;
    }

    private static int getUniqueRandomIndex(ArrayList<Integer> usedIndices, int max) {
        int randomIndex = ThreadLocalRandom.current().nextInt(0, max);
        final boolean contains = usedIndices.contains(randomIndex);
        if (contains)
            randomIndex = getUniqueRandomIndex(usedIndices, max);
        return randomIndex;
    }
}

暫無
暫無

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

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