两个数组之间的差异

ade*_*mcu 10 java arrays

可能重复:
java中arraylists的交集/并集

你好,我有两个字符串数组.我想打印两个arrrays之间的差异.是否有任何java方法?例如;

String[ ] first={"A","B","C"};
String[ ] second={"C","B"};
Run Code Online (Sandbox Code Playgroud)

结果必须是"A".感谢所有评论.

Jig*_*shi 9

将数组转换为 Set<String>

new HashSet<String>(Arrays.asList(array));
Run Code Online (Sandbox Code Playgroud)

并做

Set<String> commonOnes = biggerSet.retainAll(smallerSet);
biggerSet.removeAll(commonOnes).add(smallerSet.removeAll(commonOnes))
Run Code Online (Sandbox Code Playgroud)

或使用番石榴 difference()

  • `retainAll`返回一个`boolean`并修改`Set`.[方法的Javadoc](https://docs.oracle.com/javase/8/docs/api/java/util/Set.html#retainAll-java.util.Collection-)说,"...删除从此设置所有未包含在指定集合中的元素." `removeAll` [表现类似](https://docs.oracle.com/javase/8/docs/api/java/util/Set.html#removeAll-java.util.Collection-). (5认同)
  • Set中不存在重复元素 (3认同)

dur*_*597 5

它在中运行O(n log n + m log m),其中n的大小为firstm的大小为second。基本上,它会对数组进行排序,然后遍历每个数组,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++;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)