输入:
RTYUUJKIOO
actul输出:
--R--1
--T--1
--U--2
--Y--1
--I--1
--J--1
--K--1
--O--2
预期产出:
--R--1
--T--1
--Y--1
--U--2
--J--1
--K--1
--I--1
--O--2
不确定在打印顺序中为什么不能保持。
逻辑如下:
static String isValid(String s)
{
boolean validString;
Map<String, Integer> characterFrequencyMap = new HashMap<String, Integer>();
String[] singleLetterStringArray = s.split("");
List<String> singleLetterStringList = Arrays.asList(singleLetterStringArray);
singleLetterStringList.stream().forEachOrdered(l -> {
Integer frequency;
if(characterFrequencyMap.containsKey(l)) {
frequency = characterFrequencyMap.get(l);
characterFrequencyMap.put(l, frequency + 1);
} else {
characterFrequencyMap.put(l, 1);
}
});
Set<String> keys = characterFrequencyMap.keySet();
Iterator<String> keyItr = keys.iterator();
while(keyItr.hasNext()) {
String key = keyItr.next();
System.out.print("--" + key + "--");
System.out.println(characterFrequencyMap.get(key));
}
return s;
}
答案 0 :(得分:2)
HashMap
不维护广告订单。如果您想维护广告订单,请使用LinkedHashMap
:
Map<String, Integer> characterFrequencyMap = new LinkedHashMap<String, Integer>();
BTW,使用Map
生成此Stream
的更好方法是使用collect()
:
Map<String,Long> characterFrequencyMap =
singleLetterStringList.stream()
.collect(Collectors.groupingBy (Function.identity (),
LinkedHashMap::new,
Collectors.counting()));
答案 1 :(得分:1)
您遇到的问题是HashMap
不维护广告订单而是使用LinkedHashMap
。
此外,在执行必要的操作之前将字符串拆分为数组然后将其转换为列表是不理想的,您可以直接在字符串上使用chars()
方法,然后开始执行必要的操作。
使用流API,可以这样做:
Map<String, Long> resultSet =
s.chars()
.mapToObj(c -> Character.toString((char) c))
.collect(groupingBy(Function.identity(),
LinkedHashMap::new, counting()));