set 相关问题

集合是其中没有元素重复的集合,其可以根据排序标准(“有序集合”)枚举其元素或者不保留顺序(“无序集合”)。

在 swift 中假设集合类型时类型推断如何工作

var arrayorset=["0","1","21"] Swift 是类型推断和类型安全,但如何快速知道集合和数组之间的区别 当需要数组而不是集合时,这将是问题

回答 2 投票 0

在 Java 中计算两个 HashMap 的 keySet 的并集

我想计算两个哈希图的键的并集。我写了下面的代码(下面是MWE),但是我 得到 UnsupportedOperationException。实现这个目标有什么好处呢? 导入java....

回答 4 投票 0

要设置的 JavaScript 数组

MDN 引用了 JavaScript 的 Set 集合抽象。我有一个对象数组,我想将其转换为一个集合,以便我能够按名称删除 (.delete()) 各种元素: var 数组 = ...

回答 6 投票 0

如何找到多个子集之间的最大交集(k个集合中n个中最常见的元素)?

举个例子: set_0={0,3,4} set_1={1,3,4} set_2={1,5,23,8,24} set_4={1,2,6,10} set_5={1,60,34,2} set_6={1,45,32,4} set_7={1,6,9,14} set_8={1,56,3,23} set_9={1,34,23,3} all_intersection=设置。

回答 1 投票 0

集合上的 Python 迭代顺序

在Python中迭代同一个集合是否保证我有完全相同的顺序(假设它是同一个集合:我不会在两次迭代之间修改它),或者我应该将集合转换为...

回答 3 投票 0

Python 的集合差值内部是如何工作的?

最近,我一直在研究一些 Python 模块,以了解它们的行为以及它们的实现的优化程度。谁能告诉Python使用什么算法来执行该集合

回答 1 投票 0

使用 Java 流从带有 Set 值的 Map 中查找公共元素集

假设我有一个 HashMap,其中包含作为字符串的键和作为整数集的值(Map>)。 并假设地图填充有以下值: 地图 假设我有一个 HashMap,其中包含作为 String 的键和作为 Set (Integer) 的 Map<String, Set<Integer>> 的值。 并假设地图填充有以下值: Map<String, Set<Integer>> map = new HashMap<>(); map.put("w1", Set.of(1,3,4,6,7)); map.put("w2", Set.of(2,3,4,5,7)); map.put("w3", Set.of(1,2,3,5,7)); 如何使用 Java 中的 Streams 找到所有键的通用值集?例如:在这种情况下,所有键的公共值集是 Set.of(3,7)。 首先请注意,使用流并不总是最干净的方式。 我的想法是获取第一组并迭代其余组以检查它们是否全部包含它: Set<Integer> res = map.values().iterator().next().stream() .filter(item -> map.values().stream().allMatch(set -> set.contains(item))) .collect(Collectors.toSet()); 这是一个简洁的解决方案,但它会检查第一组两次。您还可以添加检查以查看地图是否包含任何条目。 我的方法是首先将不同的值分组并进行计数。然后只保留那些计数等于映射中条目数的条目。这是可行的,因为每个集合只能包含该值一次。 map.values().stream().flatMap(Set::stream) .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) .entrySet().stream().filter(e -> e.getValue() == map.size()) .map(Map.Entry::getKey).collect(Collectors.toSet()); 这可以通过利用 collect() 操作来完成。 此方法背后的逻辑是从值集合中获取随机集,用一个新集包装它以避免突变,然后使用retainlAll()方法将所有集组合在一起一个。 即使值由不可变集表示(如问题中的示例),这也不是问题,因为它们将被完整保留。唯一会发生突变的集合是由collect()内的supplier函数提供的新集合。 如果地图空,可能会出现问题。 在这种情况下,任何从values集合中获取first set的尝试都会失败。因此,这种情况必须单独处理,如下面的方法getFirst()所示。 它可能看起来像: public static Set<Integer> getIntersectionStream(Map<String, Set<Integer>> map) { return map.values().stream() .collect(() -> getFirst(map), Set::retainAll, Set::addAll); } 相同的逻辑可以迭代实现: public static Set<Integer> getIntersectionLoop(Map<String, Set<Integer>> map) { Set<Integer> intersection = new HashSet<>(getFirst(map)); for (Set<Integer> next: map.values()) { intersection.retainAll(next); } return intersection; } 方法 get getFirst() 负责从 values 集合中检索 random set。在空映射的情况下,它将返回一个空的不可修改的集合,否则,它将产生流返回的第一个集合。 注意,在这种情况下,在可选项上调用 get() 是安全的,因为我们期望结果出现。 public static Set<Integer> getFirst(Map<String, Set<Integer>> map) { return map.isEmpty() ? Collections.emptySet() : new HashSet<>(map.values().stream().findFirst().get()); } 主要 public static void main(String[] args) { Map<String, Set<Integer>> map = Map.of("w1", Set.of(1,3,4,6,7), "w2", Set.of(2,3,4,5,7), "w3", Set.of(1,2,3,5,7)); System.out.println(getIntersectionStream(map)); System.out.println(getIntersectionLoop(map)); } 输出 [3, 7] [3, 7] Set<Integer> commonValues(Map<String, Set<Integer>> map) { if (map.isEmpty()) { return new HashSet<>(); } Set<Integer> intersection = new HashSet<>(map.values().iterator().next()); map.values().forEach(v -> intersection.retainAll(v)); return intersection; } 通用且可能有效的解决方案可能是: public static <T> Set<T> retain(Map<?, Set<T>> map) { Iterator<Set<T>> it = map.values().iterator(); if (!it.hasNext()) { return new HashSet<>(); } Set<T> result = new HashSet<>(it.next()); while (it.hasNext() && !result.isEmpty()) { result.retainAll(it.next()); } return result; } 注意 !result.isEmpty(),这是提前退出条件。 IE。如果结果为空,则这些集合没有共同元素。 注意:这是受到MikeFHay的answer的启发。 如果你确实想使用流,并且可以保证Set是可变的,那么你也可以使用reduce()终端操作: public static <T> Set<T> retain(Map<?, Set<T>> map) { return map.values().stream() .reduce((a, b) -> { a.retainAll(b); return a; }) .orElse(Set.of()); } 但请注意,这会修改并返回地图中的第一个集合。 这个简单的版本使用带有集合操作的流来通过查找其中一个成员来填充 intersections,并 retainAll 来匹配所有其他成员: Set<Integer> intersection = new HashSet<>(); map.values().stream().limit(1).forEach(intersection::addAll); map.values().stream().forEach(intersection::retainAll); 我首先建议不要使用流,只需如下所示简单地执行即可。这确实删除了地图的一个元素。 你可以只做 map.get("w1") 并做一个多余的 retainAll。 请注意,由于您使用 Map.of 创建了一个不可变集,我必须制作一个副本以允许修改 result。 Set<Integer> result = new HashSet<>(map.remove("w1")); for (Set<Integer> set : map.values()) { result.retainAll(set); } 这是一个流解决方案。 为了避免使用初始化程序进行归约操作,我将使用 reducing Collector。该收集器返回一个 Optional,因此必须使用 orElse 来检索集合并允许空地图。 Set<Integer> result = map.values().stream() .collect(Collectors.reducing((a, b) -> { a.retainAll(b); return a; }))..orElse(new HashSet<>()); System.out.println(result); 以上都会打印 [3, 7] 显示的解决方案假定已正确填充 Map。 完整的解决方案将包括检查 在我看来,这是最好的解决方案: map.values().stream().reduce((s1, s2) -> { Set<Integer> s3 = new HashSet<>(s2); s3.retainAll(s1); return s3; }).orElse(new HashSet<>()); 它是通过集合相交而减少的地图值流。 这可以使用Stream.reduce来解决: Set<Integer> commonElements = map.values().stream() .reduce((s1, s2) -> s1.stream() .filter(s2::contains) .collect(Collectors.toUnmodifiableSet())) .orElseThrow(NoSuchElementException::new); 归约的每一步都会创建一个新的Set,其中仅包含两个集合之间的共同元素。 我在这里没有做的一个简单的优化(为了简单起见)是有条件地交换 s1 和 s2 ,以便较小的集合被流式传输,因为这是基于大小的线性时间发生的套装中的。

回答 9 投票 0

在 Java 中使用流从值为集合的 Map 中查找公共元素集

假设我有一个 HashMap,其中包含作为字符串的键和作为整数集的值(Map)。 并假设地图填充有以下值: 地图 假设我有一个 HashMap,其中包含作为字符串的键和作为整数集的值(Map)。 并假设地图填充有以下值: Map<String, Set<Integer>> map = new HashMap<>(); map.put("w1", Set.of(1,3,4,6,7)); map.put("w2", Set.of(2,3,4,5,7)); map.put("w3", Set.of(1,2,3,5,7)); 如何使用 Java 中的 Streams 找到所有键的通用值集?例如:在这种情况下,所有键的公共值集是 Set.of(3,7) 首先请注意,使用流并不总是最干净的方式。 我的想法是获取第一组并迭代其余组以检查它们是否全部包含它: Set<Integer> res = map.values().iterator().next().stream() .filter(item -> map.values().stream().allMatch(set -> set.contains(item))) .collect(Collectors.toSet()); 这是一个简洁的解决方案,但它会检查第一组两次。您还可以添加检查以查看地图是否包含任何条目。 Set<Integer> commonValues(Map<String, Set<Integer>> map) { if (map.isEmpty()) { return new HashSet<>(); } Set<Integer> intersection = new HashSet<>(map.values().iterator().next()); map.values().forEach(v -> intersection.retainAll(v)); return intersection; } 我的方法是首先将不同的值分组并进行计数。然后只保留那些计数等于映射中条目数的条目。这是可行的,因为每个集合只能包含该值一次。 map.values().stream().flatMap(Set::stream) .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) .entrySet().stream().filter(e -> e.getValue() == map.size()) .map(Map.Entry::getKey).collect(Collectors.toSet()); 这可以通过利用 collect() 操作来完成。 此方法背后的逻辑是从值集合中获取随机集,用一个新集包装它以避免突变,然后使用retainlAll()方法将所有集组合在一起一个。 即使值由不可变集表示(如问题中的示例),这也不是问题,因为它们将被完整保留。唯一会发生突变的集合是由collect()内的supplier函数提供的新集合。 如果地图空,可能会出现问题。 在这种情况下,任何从values集合中获取first set的尝试都会失败。因此,这种情况必须单独处理,如下面的方法getFirst()所示。 它可能看起来像: public static Set<Integer> getIntersectionStream(Map<String, Set<Integer>> map) { return map.values().stream() .collect(() -> getFirst(map), Set::retainAll, Set::addAll); } 相同的逻辑可以迭代实现: public static Set<Integer> getIntersectionLoop(Map<String, Set<Integer>> map) { Set<Integer> intersection = new HashSet<>(getFirst(map)); for (Set<Integer> next: map.values()) { intersection.retainAll(next); } return intersection; } 方法 get getFirst() 负责从 values 集合中检索 random set。在空映射的情况下,它将返回一个空的不可修改的集合,否则,它将产生流返回的第一个集合。 注意,在这种情况下,在可选项上调用 get() 是安全的,因为我们期望结果出现。 public static Set<Integer> getFirst(Map<String, Set<Integer>> map) { return map.isEmpty() ? Collections.emptySet() : new HashSet<>(map.values().stream().findFirst().get()); } 主要 public static void main(String[] args) { Map<String, Set<Integer>> map = Map.of("w1", Set.of(1,3,4,6,7), "w2", Set.of(2,3,4,5,7), "w3", Set.of(1,2,3,5,7)); System.out.println(getIntersectionStream(map)); System.out.println(getIntersectionLoop(map)); } 输出 [3, 7] [3, 7] 通用且可能有效的解决方案可能是: public static <T> Set<T> retain(Map<?, Set<T>> map) { Iterator<Set<T>> it = map.values().iterator(); if (!it.hasNext()) { return new HashSet<>(); } Set<T> result = new HashSet<>(it.next()); while (it.hasNext() && !result.isEmpty()) { result.retainAll(it.next()); } return result; } 注意 !result.isEmpty(),这是提前退出条件。 IE。如果结果为空,则这些集合没有共同元素。 注意:这是受到MikeFHay的answer的启发。 如果你确实想使用流,并且可以保证Set是可变的,那么你也可以使用reduce()终端操作: public static <T> Set<T> retain(Map<?, Set<T>> map) { return map.values().stream() .reduce((a, b) -> { a.retainAll(b); return a; }) .orElse(Set.of()); } 但请注意,这会修改并返回地图中的第一个集合。 这个简单的版本使用带有集合操作的流来通过查找其中一个成员来填充 intersections,并 retainAll 来匹配所有其他成员: Set<Integer> intersection = new HashSet<>(); map.values().stream().limit(1).forEach(intersection::addAll); map.values().stream().forEach(intersection::retainAll); 我首先建议不要使用流,只需如下所示简单地执行即可。这确实删除了地图的一个元素。 你可以只做 map.get("w1") 并做一个多余的 retainAll。 请注意,由于您使用 Map.of 创建了一个不可变集,我必须制作一个副本以允许修改 result。 Set<Integer> result = new HashSet<>(map.remove("w1")); for (Set<Integer> set : map.values()) { result.retainAll(set); } 这是一个流解决方案。 为了避免使用初始化程序进行归约操作,我将使用 reducing Collector。该收集器返回一个 Optional,因此必须使用 orElse 来检索集合并允许空地图。 Set<Integer> result = map.values().stream() .collect(Collectors.reducing((a, b) -> { a.retainAll(b); return a; }))..orElse(new HashSet<>()); System.out.println(result); 以上都会打印 [3, 7] 显示的解决方案假定已正确填充 Map。 完整的解决方案将包括检查 在我看来,这是最好的解决方案: map.values().stream().reduce((s1, s2) -> { Set<Integer> s3 = new HashSet<>(s2); s3.retainAll(s1); return s3; }).orElse(new HashSet<>()); 它是通过集合相交而减少的地图值流。 这可以使用Stream.reduce来解决: Set<Integer> commonElements = map.values().stream() .reduce((s1, s2) -> s1.stream() .filter(s2::contains) .collect(Collectors.toUnmodifiableSet())) .orElseThrow(NoSuchElementException::new); 归约的每一步都会创建一个新的Set,其中仅包含两个集合之间的共同元素。 我在这里没有做的一个简单的优化(为了简单起见)是有条件地交换 s1 和 s2 ,以便较小的集合被流式传输,因为这是基于大小的线性时间发生的套装中的。

回答 9 投票 0

集合中的多个元素具有相同的哈希值

当我阅读 SymPy 1.13.0 发行说明时,一个条目引起了我的注意(强调我的): Float 和涉及 Float 的表达式的哈希函数现在遵循哈希不变量...

回答 1 投票 0

Python 集合中的哈希行为

我试图理解集合在Python内部是如何运作的。 我编写了一个元组的子类,如下所示: 从随机导入随机 类球(元组): def __hash__(自身): a=超级()。

回答 1 投票 0

如何根据条件更新某些行?

我正在努力实施两个“标志”栏,以显示申请人是否已经通过了称为“清算”的流程,以及该申请人是否有过之前的标准申请

回答 1 投票 0

CurrentDb.执行strSQL - 无法获取表值以设置为新用户输入

Access BD, VBA / SQL Newby -- 请原谅我的无知 我有一个表单,应该更新输入到 PWord1 中的用户密码,然后重新输入到 PWOrd2 中。如果他们做的一切都是正确的那么......

回答 1 投票 0

CodeForces 竞赛 > 1761 \ 问题 C(集合构造)- 如何解决此问题?

伙计们,我从早上(4小时前)就开始研究这个问题,但仍然找不到正确的答案。如何设置具有这些条件的子集?例如,A 集是...的子集

回答 1 投票 0

列出每个排名有一个元素的所有 5 支球队的集合

这将用于公平排名的团队选择(每个团队必须恰好拥有每个排名的一个元素)。 elegibe 玩家的一个例子是: 排名 1:“利亚姆”、“艾玛”、“诺亚”、“奥利维亚”、“艾娃” 拉...

回答 1 投票 0

如何制作排序的长整型空间缩减数据结构?

如何创建一个集合数据结构来减少长整型排序数组的存储空间消耗? 目标: 必须支持以下操作: 插入新数字 删除 ce...

回答 1 投票 0

拆分和排序字符串数组 swift 3

我正在寻找最有效的方法来解决这个问题。假设有一个对象数组,按名称的字母顺序映射: 让 objectArray = [AnyObject]() 让 abcNameObjectArray = ["艾米", "

回答 2 投票 0

如果哈希集中只有一个元素,我该如何取出它?

我有一套如下: HashSet set = new HashSet(); 设置.add(1); 怎么才能把1取出来呢?我可以通过 for(integer i : set) 来做到这一点。我指定的问题是“鉴于...

回答 5 投票 0

如何在 python 中查找文本文件中的重复项并创建一个不含重复项的新文本文件

我正在尝试从文本文件中删除重复项以使当前流程更加高效 输入示例: 1 1 1 1 2 1 3 1 4 1 示例输出: 1 1 2 1 3 1 4 1 我的问题是...

回答 1 投票 0

如何让`set!`改变`let`(Scheme)中的变量?

最近自学MIT 6.5151课程时,我按照ps0的要求阅读了SICP 1到2.1(也按照CS 61A笔记的要求阅读了2.2.1),然后阅读了Software Design for Flexibility(SDF)Prologue,章节...

回答 1 投票 0

极性将列表[str]列聚合到集合[str]中

我有极坐标数据框: df = pl.DataFrame({ 'col1': [["aaa", "aaa"], ["bbb", "ccc"], ["ccc", "ddd", "ddd"], ["ddd&quo...

回答 2 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.