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: 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
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] $