在java中对集合进行连接和析取的最佳方法

时间:2014-07-27 19:30:38

标签: java arrays collections arraylist

在两个ArrayLists上创建andor方法的最有效方法是什么?

//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"}

我需要实现这两种方法(非常简单),但我需要高效地完成它,因为我将andor覆盖数百个字符串的集合。有提示吗?

3 个答案:

答案 0 :(得分:0)

你可以使用Set,只需要施放。

List<String> list = new ArrayList<String>();
Set<String> set = new HashSet<String>(list);

并使用其方法来做到这一点

答案 1 :(得分:0)

为避免混淆,我会调用方法intersectionunion,因为ANDOR的含义有点含糊不清。

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。这有两个目的:

  1. SetO(1) containsO(n)List。这有助于交叉情况。
  2. Set保证唯一性。这有助于工会案件。
  3. 另请注意,我在执行操作之前复制了集合 - 因为Java通过值传递引用而不是复制会导致原始集合被更改。

    如果您需要保留订单,则需要使用LinkedHashSet作为HashSet没有订单。

答案 2 :(得分:0)

您想要建立两个ArrayLists的交集和并集。 我认为这是一个重复的问题。 我建议看看这个帖子: Intersection and union of ArrayLists in Java