【问题标题】:Counting the number of elements in a List and appending it to the end of each item and maintaining insertion order in list to be returned?计算列表中元素的数量并将其附加到每个项目的末尾并保持要返回的列表中的插入顺序?
【发布时间】:2020-06-26 13:27:53
【问题描述】:

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

示例输入:

["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));
    }
}

【问题讨论】:

  • 使用Map&lt;String, Integer&gt; 来记录您看到的每个不同项目的数量;然后遍历输入列表,根据您存储在 Map 中的信息修改项目名称,将修改后的名称添加到结果中,并调整 Map 以记录该项目的再次出现。

标签: java algorithm collections hashmap


【解决方案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());
}

【讨论】:

  • 完美运行!谢谢你的解释。我不知道我可以使用全部替换。很好的解决方案
猜你喜欢
  • 2021-07-03
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
相关资源
最近更新 更多