11

Possible Duplicate:
intersection/union of arraylists in java

Hello I have two string arrays.I want to print differences between two arrrays.Is there any java method for this? For example;

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

and result must be "A". Thanks for all comments.

5
  • Same as stackoverflow.com/questions/5283047/… ? Commented Dec 5, 2012 at 21:01
  • 1. Does the order matter? 2. What about duplicate elements? 3. What about elements that are added in the second array? 4. What about the index of each difference?... --- Bottom line: could you please supply a few more less trivial examples so that we can understand what exactly you are asking? Commented Dec 5, 2012 at 22:09
  • 4
    This post is about difference, not intersection or union. It is not not covered by 5283047. Commented Dec 5, 2012 at 22:45
  • @fredt true, but we can get difference by intersecting, removing and joining :) Commented Dec 5, 2012 at 23:29
  • @Oleg, sure, but in a suboptimal way. This question is getting answers, is not covered by the existing question, and shouldn't be deleted. Commented Dec 5, 2012 at 23:46

2 Answers 2

12

Convert array to Set<String>

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

and do

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

or use guava difference()

Sign up to request clarification or add additional context in comments.

6 Comments

Will this get elements that are in the smaller array but not the larger one?
This only works if: 1. The order doesn't matter, 2. The if an element shows up twice in one and once in the other still means equal. It might work for the asker but warning...
duplicate element won't exist in Set
@fgb hmmm... not converting it to hashset, and using retainAll on a list?
retainAll returns a boolean and modifies the Set. The Javadoc for the method says, "...removes from this set all of its elements that are not contained in the specified collection." removeAll behaves similarly.
|
5

This runs in O(n log n + m log m), where n is the size of first, and m is the size of second. Basically, it sorts the arrays, then pass through each one, adding ones that don't match to the LinkedList at each opportunity, then makes an array at the end. The earlier revision of this code did not work correctly because the trailing elements in the longer list were not getting added at the end.

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++;
        }
    }
}

3 Comments

More code, but much better than the asList workarounds. +1!
this doesnt seem to work. I mean it almost works! for example, `code String[] arrA = {"1", "2", "3", "4", "5", "25", "10"}; String[] arrB = {"1", "2", "10", "4", "30"}; for these two arrays it returns 25,3,30. It leaves out 5.
@OpenSource Wow I bet it doesn't work a lot more thoroughly than that. Give me a few minutes.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.