我正在研究一个问题,需要一些可能的解决方法。
输入样例:
["tv", "speaker", "tv", "radio", "radio", "tv"]
样本输出:
["tv", "speaker", "tv1", "radio", "radio1", "tv2"]
添加出现次数,同时保留第一个出现的位置。
到目前为止,我已经将元素添加到HashMap并使用Collection.frequency / get put作为元素计数来计算元素的数量。但是,如何在末尾附加相应的数字呢?
public class DeviceManagement {
public static List<String> Solution(List<String> ls) {
Map<String, Integer> map = new LinkedHashMap<>();
int counter = 1;
for (String str : ls) {
if (map.containsKey(str)) {
map.put(str, map.get(str) + 1);
} else {
map.put(str, counter);
}
}
System.out.println(map);
return null;
}
public static void main(String[] args) {
List<String> ls = new ArrayList<>();
ls.add("speaker");
ls.add("tv");
ls.add("radio");
ls.add("toaster");
ls.add("radio");
ls.add("speaker");
System.out.println(ls);
System.out.println(Solution(ls));
}
}
问题来源:Stack Overflow
您的代码可以正确检测重复项并计算频率,但是List在进行迭代时,不会使用中的任何元素替换为其新值。为了简化此操作,我建议使用List#replaceAll而不是for循环。您的代码如下所示:
public static List<String> solution(List<String> ls) {
Map<String, Integer> map = new HashMap<>();
ls.replaceAll(element -> {
if (map.containsKey(element)) {
int oldAmount = map.put(element, map.get(element) + 1);
return element + oldAmount;
} else {
map.put(element, 1);
return element;
}
});
return ls;
}
这将导致您的输出为:
[speaker, tv, radio, toaster, radio1, speaker1]
为了简化代码,您可以利用Map#merge:
public static List<String> solution(List<String> ls) {
Map<String, Integer> map = new HashMap<>();
ls.replaceAll(element -> {
int newValue = map.merge(element, 1, Integer::sum);
return newValue == 1 ? element : element + (newValue - 1);
});
return ls;
}
如果要返回其他List对象,则可以流式传输输入,将其映射并收集到另一个对象List:
public static List<String> solution(List<String> ls) {
Map<String, Integer> map = new HashMap<>();
return ls.stream().map(element -> {
int newValue = map.merge(element, 1, Integer::sum);
return newValue == 1 ? element : element + (newValue - 1);
}).collect(Collectors.toList());
}
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。