Reputation: 87
I am dealing with anagrams so I'm concerned only with the characters present in the string but not their order. I searched for a suitable Collection class but in vain.
Can you please suggest any class that could help me to keep duplicates but ignores order?
Upvotes: 4
Views: 114
Reputation: 109547
Instead of an ordered data structure, one can also dynamically sort the data.
As Unicode symbols, code points, are better than UTF-16 char
s, I'll use Unicode int
s instead:
int[] canonical(String s) {
return s.codePoints().sorted().toArray();
}
boolean isAnagram(String s, String t) {
return Arrays.equals(canonical(s), canonical(t));
}
boolean isAnagram(int[] s, String t) {
return Arrays.equals(s, canonical(t));
}
Upvotes: 1
Reputation: 5486
You can use Google guava's HashMultiSet
. The equals()
method does exactly that:
Compares the specified object with this multiset for equality. Returns true if the given object is also a multiset and contains equal elements with equal counts, regardless of order. This implementation returns true if object is a multiset of the same size and if, for each element, the two multisets have the same count.
Upvotes: 1
Reputation: 393771
You can use a Map<Character,Integer>
to count the number of occurrences of each character of a String
. If the Map
s generated for two String
s are equal, you'll know that the corresponding String
s are anagrams.
For example (here I used Map<Integer,Long>
instead of Map<Character,Integer>
since it was more convenient):
String one = "animal";
String two = "manila";
Map<Integer,Long> mapOne = one.chars ().boxed().collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));
Map<Integer,Long> mapTwo = two.chars ().boxed().collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));
System.out.println ("Is anagram? " + mapOne.equals(mapTwo));
Output:
Is anagram? true
Upvotes: 8