Java 如何从HashMap中获取少量随机键
我有一张有标题的地图。我想从hashmap中打印10个随机键 例如,我的地图(字符串,对象)包含100对:“A,新对象(…)”、“B,…”、“C,…”等 我想从这个映射中获得10个随机键,并将其附加到一个字符串中 所以我的字符串应该像:“A\nD\nB”Java 如何从HashMap中获取少量随机键,java,hashmap,Java,Hashmap,我有一张有标题的地图。我想从hashmap中打印10个随机键 例如,我的地图(字符串,对象)包含100对:“A,新对象(…)”、“B,…”、“C,…”等 我想从这个映射中获得10个随机键,并将其附加到一个字符串中 所以我的字符串应该像:“A\nD\nB” Set keys=myMap.keySet(); 字符串组合=”; 对于(int i=0;i不重复地获取随机10个键的快速方法是将键放入列表中,并使用集合。shuffle来洗牌列表 Map<String, Object> map =
Set keys=myMap.keySet();
字符串组合=”;
对于(int i=0;i不重复地获取随机10个键的快速方法是将键放入列表中,并使用集合。shuffle
来洗牌列表
Map<String, Object> map = ...yourmap
ArrayList<String> keys = new ArrayList<>(map.keySet());
Collections.shuffle(keys);
List<String> randomTenKeys = keys.subList(0, 10);
Map=…您的地图
ArrayList keys=新的ArrayList(map.keySet());
收藏。洗牌(键);
列出randomTenKeys=keys.subList(0,10);
创建一个包含所有密钥的列表并对其进行无序化并不是最有效的方法。您可以通过一个算法在一次传递中完成。我没有研究过它,但您可能会在一些Apache或Guava库中找到一个实现。Joni的答案非常好而且简短。但是,如果您愿意,这里有一个完全有效的示例。我拆分了你的问题可以分为两种方法:一种是返回随机选择的键列表,另一种是以你喜欢的任何方式打印键。你可以将这两种方法合并为一种方法。但是,最好将它们分开
import java.util.*;
import java.util.stream.IntStream;
public class Test {
public static void main(String [] args){
Map<String, Object> map = new HashMap<>();
//You can use for loop instead to make a map of String, Integer.
IntStream.rangeClosed(0, 9).forEach(i -> map.put(i +"", i));//Map of 10 numbers.
List<String> keys = getRandomKeys(map, 3);
String allKeys = combineKeys(keys, "\n");
System.out.println(allKeys);
}
public static List<String> getRandomKeys(Map<String, Object> map, int keyCount) {
List<String> keys = new ArrayList<>(map.keySet());
for(int i = 0; i < map.size()-keyCount; i++){
int idx = (int) ( Math.random() * keys.size() );
keys.remove(idx);
}
return keys;
}
public static String combineKeys(List<String> keys, String separator){
String all = "";
for(int i = 0; i < keys.size() - 1; i++){
all = all + keys.get(i) + separator;
}
all += keys.get(keys.size()-1);//last element does not need separator.
return all;
}
}
import java.util.*;
导入java.util.stream.IntStream;
公开课考试{
公共静态void main(字符串[]args){
Map Map=newhashmap();
//您可以使用for循环来生成字符串Integer的映射。
IntStream.rangeClosed(0,9).forEach(i->map.put(i+“”,i));//10个数字的映射。
列表键=getRandomKeys(映射,3);
字符串allKeys=combineKeys(键“\n”);
System.out.println(所有键);
}
公共静态列表getRandomKeys(映射映射,int keyCount){
List keys=newarraylist(map.keySet());
对于(int i=0;i
这是对的补充回答。使用字符串:join
加入随机键
以下是:
HashMap以随机顺序存储已经存在的值。
您可以直接使用
for(Map.Entry entry : map.entrySet())
str.append(entry.getKey()+" "+entry.getValue());
但是,如果每次都需要新订单,则可以洗牌数据。
对于洗牌,您需要获得数组或列表中的所有键
然后,您可以洗牌该列表并在该列表上迭代,以从hashmap“随机”或“任意”获取值?你每次都想要不同的键,没有明显的模式,还是你只想要10个键,而你不在乎哪个?我的意思是随机但唯一。键不应该重复。你尝试过什么?你知道如何从ArrayList中获得10个随机项吗?这是一个很好的开始。我尝试了随机和列表,但我可以得到相同的随机数ers和输出将类似于“A,A,B”。没有Set.get(int)
方法。如果确实存在Set.get(int)
方法,则此方法将从原始映射中删除项,因为它调用键。remove
getRandomKeys
删除键计数
键,并返回map.size()-密钥计数
keys@Joni-谢谢你找到这个bug!我更改了代码和测试密钥计数以避免这种bug。
Map<String, Object> map = ...yourmap
ArrayList<String> keys = new ArrayList<>(map.keySet());
Collections.shuffle(keys);
List<String> randomTenKeys = keys.subList(0, 10);
String joinedKeys = String.join("\n", randomTenKeys);
for(Map.Entry entry : map.entrySet())
str.append(entry.getKey()+" "+entry.getValue());