Exempel: Hitta duplicerade ord med HashSet

Sven-Olof Nyström
OOP med Java våren -25
Informationsteknologi
Uppsala Universitet

Programmet ska gå igenom de strängar som ges på kommandoraden och tala om vilka strängar (ord) som förekommer två gånger.

Ansats 1

Ansats 1: lägg in alla ord du ser i en HashSet. Metoden add returnerar true om operationen ändrade mängdens innehåll, så om new1 inte är true vet vi att strängen setts tidigare.

public class FindDups {
    public static void main(String args[]) {

        Set<String> s = new HashSet<String>();

        for (String a : args) {

	    boolean new1 = s.add(a);
	    if (! new1) {
                System.out.println("Duplicate detected: "+a);
	    }
	}

        System.out.println(s.size()+" distinct words detected: "+s);
    }
}

Körexempel 1:

$ java FindDups att tänka fritt är stort att tänka rätt är större
Duplicate detected: att
Duplicate detected: tänka
Duplicate detected: är
7 distinct words detected: [stort, fritt, är, att, rätt, större, tänka]

Körexempel 2:

:$ java FindDups x x x x
Duplicate detected: x
Duplicate detected: x
Duplicate detected: x
1 distinct words detected: [x]

Program: program/collect/FindDups.java, program/collect/FindDups2.java

Ansats 2:

Bygg upp två mängder, uniques och dups. I for-loopen adderas alla element till uniques, och de som förekommer mer än en gång adderas till dups. Sedan använder vi metoden removeAll för att ta bort alla element i uniques som också förekommer i dups.

public class FindDups2 {
    public static void main(String args[]) {

        Set <String> uniques = new HashSet<String>();
        Set <String> dups = new HashSet<String>();

        for (String s : args) {
	    boolean new1 = uniques.add(s);
	    if (!new1)
		dups.add(s);
	}
        uniques.removeAll(dups);  // Destructive set-difference

        System.out.println("Unique words:    " + uniques);
        System.out.println("Duplicate words: " + dups);
    }
}

Testkörningar:

$ java FindDups2 att tänka fritt är stort att tänka rätt är större
Unique words:    [stort, fritt, rätt, större]
Duplicate words: [är, att, tänka]
$ java FindDups2 x x x x
Unique words:    []
Duplicate words: [x]
$