java 如何从Map中删除元素的1个频率?

slsn1g29  于 2022-12-10  发布在  Java
关注(0)|答案(3)|浏览(89)

我在测验中尝试回答这个问题。
它要求确保一个数组最多可以包含2个重复的元素,如果任何元素出现超过两次,则应将其删除。

Given -    [2, 2, 2, 3, 4, 4, 5]
Expected - [2, 2, 3, 4, 4, 5]

因此,我尝试了如下方法-
第一次
由于值-2与频率-3,需要从Map中删除“2”

// 3. Remove 'need_to_remove' value from map
map.remove(need_to_remove);

但这样做,它会从map中删除Element - 2的所有示例。
{3=1, 4=2, 5=1}
我不太确定接下来要做什么。

brccelvz

brccelvz1#

创建一个新的空列表(我们称之为dest)和一个值和频率的Map(我们称之为freq)。
通过迭代data列表来填充dest列表。
当您逐一查看清单时,请更新freq,并递增Map于data中之值的索引键值。
如果freq.get(value)大于2,则不将其复制到dest
一旦你完全迭代了data列表,dest应该包含不超过2个给定值示例的值。
此外,freq还应包含该键在data中出现的 * 总 * 次数。
这使得你不需要在原地改变data列表-你只是复制它,并且最多只复制给定值的2。

qlvxas9a

qlvxas9a2#

如果输入是一个列表,频率Map应该只用于跟踪使用Map::merge方法的出现次数。如果使用迭代器遍历列表,可以从列表中删除重复的元素,并且Iterator具有remove()方法:

List<Integer> list = new ArrayList<>(Arrays.asList(2, 2, 2, 3, 4, 4, 5));

Map<Integer, Integer> freq = new HashMap<>();
for (Iterator<Integer> it = list.iterator(); it.hasNext(); ) {
    if (freq.merge(it.next(), 1, Integer::sum) > 2) {
        it.remove();
    }
}
System.out.println(list); // -> [2, 2, 3, 4, 4, 5]

如果输入是以数组形式提供的,则应创建一个新的调整大小的数组,并复制相应的元素。

int[] arr = {2, 2, 2, 3, 3, 4, 4, 2, 3, 5, 6, 4, 2};
Map<Integer, Integer> freq2 = new HashMap<>();

int i = 0;
for (int n : arr) {
    if (freq.merge(n, 1, Integer::sum) <= 2) {
        arr[i++] = n;
    }
}
arr = Arrays.copyOf(arr, i);
System.out.println(Arrays.toString(arr)); // -> [2, 2, 3, 3, 4, 4, 5, 6]
hgqdbh6s

hgqdbh6s3#

remove()用于从Map中删除任何特定键的Map。
假设这个Map是你的数据hashMap.并且你想减少你的键中的值的计数,这里是2.所以你应该通过获取值并减少它来再次设置值.就像这样

map.put(key, map.get(key) - 1);

但是你应该在你逮捕中去掉一把钥匙,而不是你的Map。

int need_to_remove_index = arr.indexOf(need_to_remove);
arr.remove(need_to_remove_index);

这样你就能更好地解决你的问题。

List<Integer> list = new ArrayList<>(Arrays.asList(2, 2, 2, 3, 4, 4, 5));
Map<Integer,Long> resultMap=  list.stream()
    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

resultMap.entrySet()
        .stream()
        .forEach(entry -> {
            if(entry.getValue() > 2){
                list.remove(entry.getKey());
            }
        });
        
 System.out.println(list.toString());

相关问题