开发者社区> 问答> 正文

计算列表中元素的数量并将其附加到每个项目的末尾,并保持要返回的列表中的插入顺序?

我正在研究一个问题,需要一些可能的解决方法。

输入样例:

["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

展开
收起
montos 2020-03-25 18:24:10 516 0
1 条回答
写回答
取消 提交回答
  • 您的代码可以正确检测重复项并计算频率,但是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

    2020-03-25 18:34:09
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
用计算和数据去改变整个世界 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载