【问题标题】:Randomly select n items from a map从地图中随机选择 n 个项目
【发布时间】:2014-09-29 19:51:45
【问题描述】:

我正在尝试从 HashMap 中随机生成“n”个项目,其中“n”由用户确定。

这是我目前所拥有的:

public static void main(String []args){
    int numColors = 3;
    HashMap<String, String> map = new HashMap<String, String>();
    map.put("White","FFFFFF");
    map.put("Blank","000000");
    map.put("Red","ED0A15");
    map.put("Green","06F76C");
    map.put("Blue","0689FF");
    map.put("Sky Blue","00C2FC");
    map.put("Light Blue","08F0FC");
    map.put("Silver","C0BFC5");
    map.put("Mint","ABD3CA");
    map.put("Off White","FFEFF0");
    map.put("Purple","736FFA");
    map.put("Lavendar","DEBEEF");
    map.put("Hot Pink","F5159A");
    map.put("Pink","DB39CC");
    map.put("Light Pink","F5C2E3");
    map.put("Blush","C95FA7");
    map.put("Orange","D4361B");
    map.put("Yellow","DEF231");
    map.put("Warm White","F3E4C3");
    map.put("Turquoise","01DCA4");

    List<String> valuesList = new ArrayList<String>(map.values());
    int randomIndex = new Random().nextInt(valuesList.size());
    String randomValue = valuesList.get(randomIndex);

    System.out.printf(randomValue);
}

它为我打印 1 种我想要的随机颜色(十六进制),但是我不确定如何/使用哪个循环来从地图中生成 3 种随机十六进制颜色。我将 numColors 声明为 3 只是为了尝试测试一下。

这是我最终的结果:

public static void main(String []args){
    int numColors = 3;
    HashMap<String, String> map = new HashMap<String, String>();
    map.put("White","FFFFFF");
    map.put("Blank","000000");
    map.put("Red","ED0A15");
    map.put("Green","06F76C");
    map.put("Blue","0689FF");
    map.put("Sky Blue","00C2FC");
    map.put("Light Blue","08F0FC");
    map.put("Silver","C0BFC5");
    map.put("Mint","ABD3CA");
    map.put("Off White","FFEFF0");
    map.put("Purple","736FFA");
    map.put("Lavendar","DEBEEF");
    map.put("Hot Pink","F5159A");
    map.put("Pink","DB39CC");
    map.put("Light Pink","F5C2E3");
    map.put("Blush","C95FA7");
    map.put("Orange","D4361B");
    map.put("Yellow","DEF231");
    map.put("Warm White","F3E4C3");
    map.put("Turquoise","01DCA4");

    List<String> keys = new ArrayList<String>(map.keySet());
    Random rand = new Random();
    for (int i = 0; i < numColors; i++) {
        String key = keys.get(rand.nextInt(keys.size()));
        System.out.println(map.get(key));
        }

 }

【问题讨论】:

  • 你试试for循环怎么样。
  • 创建Random的单个实例,然后使用for循环多次运行随机选择。
  • 要复制吗??
  • 我想要 3 种随机颜色,所以它可能会重复,也可能不会。
  • @user3130128 for 声明就是你需要的

标签: java list random arraylist hashmap


【解决方案1】:

一个简单的解决方案是使用Collections.shuffle(map) 对整个地图进行洗牌。然后只需遍历它并选择第一个 n 个元素。

当然,如果地图很大并且您只需要几个元素,这没有任何意义。

编辑:

当然,使用此解决方案,您不会得到任何重复的条目

【讨论】:

  • 在我的代码示例中,这是所有地图元素,所以它不是很大。
  • 最好注意这可以防止重复结果。
【解决方案2】:

如果我理解你的问题,你可以这样做

List<String> keys = new ArrayList<String>(map.keySet());
Random rand = new Random();
for (int i = 0; i < numColors; i++) {
    String key = keys.get(rand.nextInt(keys.size()));
    System.out.println(map.get(key));
}

【讨论】:

  • 感谢 Elliott 完美运行。只是一个附带问题,此解决方案允许重复颜色正确吗?所以理论上 FFFFFF 可能会出现两次。
  • 回答了我自己的问题,它确实允许重复。
【解决方案3】:

在 cmets 中提到了变化

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        int numColors = 3;
        HashMap<String, String> map = new HashMap<String, String>();
        map.put("White", "FFFFFF");
        map.put("Blank", "000000");
        map.put("Red", "ED0A15");
        map.put("Green", "06F76C");
        map.put("Blue", "0689FF");
        map.put("Sky Blue", "00C2FC");
        map.put("Light Blue", "08F0FC");
        map.put("Silver", "C0BFC5");
        map.put("Mint", "ABD3CA");
        map.put("Off White", "FFEFF0");
        map.put("Purple", "736FFA");
        map.put("Lavendar", "DEBEEF");
        map.put("Hot Pink", "F5159A");
        map.put("Pink", "DB39CC");
        map.put("Light Pink", "F5C2E3");
        map.put("Blush", "C95FA7");
        map.put("Orange", "D4361B");
        map.put("Yellow", "DEF231");
        map.put("Warm White", "F3E4C3");
        map.put("Turquoise", "01DCA4");

        // scanner for accepting values
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter number");
        int N = scan.nextInt();

        // random object for generating random values
        Random rand = new Random();

        // converting map values to list
        List<String> valuesList = new ArrayList<String>(map.values());

        for (int i = 1; i <= N; i++) {
            // choose random value
            int randomIndex = rand.nextInt(valuesList.size());
            // get value
            String randomValue = valuesList.get(randomIndex);
            // printing
            System.out.println("Random value " + i + " : " + randomValue);
        }
    }
}

为了防止重复,您可以执行以下操作:

// random object for generating random values
Random rand = new Random();

// converting map values to list
List<String> valuesList = new ArrayList<String>(map.values());

Set<String> set = new HashSet<String>();

while (set.size() != N) {
    int randomIndex = rand.nextInt(valuesList.size());
    String randomValue = valuesList.get(randomIndex);
    set.add(randomValue);
}

System.out.println(set);

【讨论】:

    【解决方案4】:

    按照 Malt 的建议,防止重复并保持代码干净:

    List<String> list = new ArrayList(map.values() );
    Collections.shuffle(list);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多