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