【问题标题】:How to randomly pick four elements from an array without repeating in Java?如何从数组中随机选择四个元素而不在 Java 中重复?
【发布时间】:2019-04-13 12:18:25
【问题描述】:

假设:

String[] fruitsArray = new String[] {"apple", "orange", "pear", "banana", "cherry", "blueberry", "papaya", "litchi"};

如何从这个数组中随机选取四个元素而不重复?

示例结果为["orange", "pear","blueberry","litchi"] 而像["apple", "orange","orange","papaya"] 这样的结果是不可接受的。

【问题讨论】:

  • 如果随机选择的元素已经存在于输出中,请再次选择,或者从fruitsArray中删除选择的元素。
  • 原始的fruitsArray 是否应该是不可变的,或者重新排列或删除元素的解决方案是否可以接受?

标签: java arrays random


【解决方案1】:

与使用Collections::shuffle 对数组或集合进行简单的洗牌相比,生成不可重复的数字并不是一件容易的事。

final String[] fruitArray = new String[]{"apple", "orange", "pear", "banana",
                                         "cherry", "blueberry", "papaya", "litchi"};

// SHUFFLE
final List<String> fruitList = Arrays.asList(fruitArray);
Collections.shuffle(fruitList);

// TEST IT
fruitList.stream()
         .limit(4)                      // sets the count to 4
         .forEach(System.out::println); // prints qualified random items without repetition

【讨论】:

    【解决方案2】:

    您可以在 java 中使用 Random() 对象。

    以下是从 ArrayList 中获取 3 个随机元素的示例,希望对您有所帮助。

     import java.util.ArrayList; 
     import java.util.List; 
     import java.util.Random; 
    
     public class GFG { 
    
    // Drive Function 
    public static void main(String[] args) 
    { 
    
        // create a list of Integer type 
        List<Integer> list = new ArrayList<>(); 
        // add 5 element in ArrayList 
        list.add(10); 
        list.add(20); 
        list.add(30); 
        list.add(40); 
        list.add(50); 
    
        GFG obj = new GFG(); 
    
        // boundIndex for select in sub list 
        int numberOfElements = 3; 
    
        // take a random element from list and print them 
        System.out.println(obj.getRandomElement(list, 
                                     numberOfElements)); 
    } 
    
    // Function select an element base on index and return 
    // an element 
    public List<Integer> getRandomElement(List<Integer> list, 
                                          int totalItems) 
    { 
        Random rand = new Random(); 
    
        // create a temporary list for storing 
        // selected element 
        List<Integer> newList = new ArrayList<>(); 
        for (int i = 0; i < totalItems; i++) { 
    
            // take a raundom index between 0 to size  
            // of given List 
            int randomIndex = rand.nextInt(list.size()); 
    
            // add element in temporary list 
            newList.add(list.get(randomIndex)); 
    
            // Remove selected element from orginal list 
            list.remove(randomIndex); 
        } 
        return newList; 
    } 
    } 
    

    输出:

      [50, 40, 30]
    

    【讨论】:

    • 在您的示例中,没有什么可以防止重复值
    • 哦!我的错误..修改了删除重复的代码
    【解决方案3】:

    创建一个随机整数数组并将它们用作数组的索引

    int[] indexes = new Random().ints(4, 0, fruitsArray.length).toArray();
    for (int i = 0; i < indexes.length; i++) {
        System.out.println(fruitsArray[i]);
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-12
      • 2015-09-21
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 2018-10-23
      • 2016-02-01
      • 1970-01-01
      相关资源
      最近更新 更多