在两个ArrayLists上创建and
和or
方法的最有效方法是什么?
//not coded in java
HashSet<String> first = {"hello", "to", "you"}
HashSet<String> second = {"hello", "to", "me"}
HashSet<String> and = and(first, second) = {"hello", "to"}
HashSet<String> or = or(first, second) = {"hello", "to", "you", "me"}
我需要实现这两种方法(非常简单),但我需要高效地完成它,因为我将and
和or
覆盖数百个字符串的集合。有提示吗?
答案 0 :(得分:0)
你可以使用Set,只需要施放。
List<String> list = new ArrayList<String>();
Set<String> set = new HashSet<String>(list);
并使用其方法来做到这一点
答案 1 :(得分:0)
为避免混淆,我会调用方法intersection
和union
,因为AND
和OR
的含义有点含糊不清。
Set
上有一个retainAll
方法可以完成交叉点的工作。你需要在another answer (of mine) on SO注意我的警告。
Collection
上有一个addAll
方法可以完成工作。
以下是一个例子:
public static void main(String[] args) throws Exception {
final Set<String> first = new HashSet<>(Arrays.asList("hello", "to", "you"));
final Set<String> second = new HashSet<>(Arrays.asList("hello", "to", "me"));
System.out.println(intersection(first, second));
System.out.println(union(first, second));
}
public static Set<String> intersection(final Set<String> first, final Set<String> second) {
final Set<String> copy = new HashSet<>(first);
copy.retainAll(second);
return copy;
}
public static Set<String> union(final Set<String> first, final Set<String> second) {
final Set<String> copy = new HashSet<>(first);
copy.addAll(second);
return copy;
}
请注意使用Set
而不是List
。这有两个目的:
Set
有O(1)
contains
而O(n)
有List
。这有助于交叉情况。Set
保证唯一性。这有助于工会案件。另请注意,我在执行操作之前复制了集合 - 因为Java通过值传递引用而不是复制会导致原始集合被更改。
如果您需要保留订单,则需要使用LinkedHashSet
作为HashSet
没有订单。
答案 2 :(得分:0)
您想要建立两个ArrayLists的交集和并集。 我认为这是一个重复的问题。 我建议看看这个帖子: Intersection and union of ArrayLists in Java