【问题标题】:differences between two arrays [duplicate]两个数组之间的差异[重复]
【发布时间】:2012-12-05 20:58:12
【问题描述】:

可能重复:
intersection/union of arraylists in java

您好,我有两个字符串数组。我想打印两个数组之间的差异。有什么 java 方法可以解决这个问题吗? 例如;

String[ ] first={"A","B","C"};
String[ ] second={"C","B"};

并且结果必须是“A”。 感谢所有cmets。

【问题讨论】:

  • 1.顺序重要吗? 2.重复元素怎么办? 3. 第二个数组中添加的元素呢? 4. 每个差异的索引呢?... --- 底线:您能否再提供一些不那么琐碎的示例,以便我们了解您的确切要求?
  • 这篇文章是关于差异,而不是交集或联合。它不在 5283047 范围内。
  • @fredt true,但我们可以通过相交、删除和加入来获得差异:)
  • @Oleg,当然,但以次优方式。此问题正在获得答案,不包含在现有问题中,不应删除。

标签: java arrays


【解决方案1】:

将数组转换为Set<String>

new HashSet<String>(Arrays.asList(array));

然后做

Set<String> commonOnes = biggerSet.retainAll(smallerSet);
biggerSet.removeAll(commonOnes).add(smallerSet.removeAll(commonOnes))

或使用番石榴difference()

【讨论】:

  • 这会得到较小数组中的元素,而不是较大数组中的元素吗?
  • 这仅在以下情况下有效: 1. 顺序无关紧要, 2. 如果一个元素在一个中出现两次并且在另一个中出现一次仍然意味着相等。它可能对提问者有用,但警告......
  • Set 中不存在重复元素
  • @fgb hmmm...不将其转换为哈希集,并在列表中使用retainAll?
  • retainAll 返回一个boolean 并修改SetJavadoc for the method 说,“......从这个集合中删除所有不包含在指定集合中的元素。” removeAllbehaves similarly.
【解决方案2】:

这在O(n log n + m log m) 中运行,其中nfirst 的大小,msecond 的大小。基本上,它对数组进行排序,然后通过每个数组,在每个机会添加与LinkedList 不匹配的数组,然后在最后创建一个数组。此代码的早期版本无法正常工作,因为较长列表中的尾随元素没有在末尾添加。

public class SetDifference {
    public static void main(String... args) {
        String[] arrA = {"1", "2", "3", "4", "5", "25", "10"};
        String[] arrB = {"1", "2", "10", "4", "30"};

        System.out.println(Arrays.toString(differences(arrA, arrB)));
    }

    public static String[] differences(String[] first, String[] second) {
        String[] sortedFirst = Arrays.copyOf(first, first.length); // O(n)
        String[] sortedSecond = Arrays.copyOf(second, second.length); // O(m)
        Arrays.sort(sortedFirst); // O(n log n)
        Arrays.sort(sortedSecond); // O(m log m)

        int firstIndex = 0;
        int secondIndex = 0;

        LinkedList<String> diffs = new LinkedList<String>();  

        while (firstIndex < sortedFirst.length && secondIndex < sortedSecond.length) { // O(n + m)
            int compare = (int) Math.signum(sortedFirst[firstIndex].compareTo(sortedSecond[secondIndex]));

            switch(compare) {
            case -1:
                diffs.add(sortedFirst[firstIndex]);
                firstIndex++;
                break;
            case 1:
                diffs.add(sortedSecond[secondIndex]);
                secondIndex++;
                break;
            default:
                firstIndex++;
                secondIndex++;
            }
        }

        if(firstIndex < sortedFirst.length) {
            append(diffs, sortedFirst, firstIndex);
        } else if (secondIndex < sortedSecond.length) {
            append(diffs, sortedSecond, secondIndex);
        }

        String[] strDups = new String[diffs.size()];

        return diffs.toArray(strDups);
    }

    private static void append(LinkedList<String> diffs, String[] sortedArray, int index) {
        while(index < sortedArray.length) {
            diffs.add(sortedArray[index]);
            index++;
        }
    }
}

【讨论】:

  • 更多代码,但比 asList 解决方法要好得多。 +1!
  • 这似乎不起作用。我的意思是它几乎可以工作!例如,`code String[] arrA = {"1", "2", "3", "4", "5", "25", "10"};字符串[] arrB = {“1”、“2”、“10”、“4”、“30”};对于这两个数组,它返回 25、3、30。它遗漏了 5。
  • @OpenSource 哇,我敢打赌它不会比这更彻底。给我几分钟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
相关资源
最近更新 更多