patternjavaMinor
Duplicate integers in an array
Viewed 0 times
arrayduplicateintegers
Problem
Code shows duplicate values of integers in an array with indexes and the number of occurrences. Can you please critique my code and provide your thoughts on where I should improve my code?
import java.util.Set;
import java.util.HashMap;
import java.util.Map;
import java.util.HashSet;
public class DuplicatesInAnArray {
private static class ShowIndexDuplicateData {
private static final String NEW_LINE = System
.getProperty("line.separator");
private Set indices;
private int count;
public ShowIndexDuplicateData(Set indices, int count) {
this.indices = indices;
this.count = count;
}
public Set getIndices() {
return indices;
}
public int getCount() {
return count;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("Count: ").append(getCount()).append(" Indices: ")
.append(getIndices()).append(NEW_LINE);
return sb.toString();
}
}
public static void duplicatesInAnArray(Integer[] array) {
if (array == null || array.length > map = new HashMap<>();
for (int i = 0; i showIndexDuplicateData = map
.get(array[i]);
showIndexDuplicateData.count++;
showIndexDuplicateData.indices.add(i);
} else {
int count = 1;
Set indices = new HashSet<>();
indices.add(i);
ShowIndexDuplicateData showIndexDuplicateData = new ShowIndexDuplicateData<>(
indices, count);
map.put(array[i], showIndexDuplicateData);
}
}
System.out.println(map);
}
public static void main(String[] args) {
Integer[] array = { 5, 6, 1, 2, 3, 3, 6, 1 };
DuplicatesInAnArray.duplicatesInAnArray(array);
}
}Solution
- You don't need to use
Setsince indexes can never repeat. Use aListisntead.
- You don't need to keep track of the
count. You can just getindices.size(). That makesShowIndexDuplicateDataclass unnecessary.
- You probably should be dealing with
int[]rather thanInteger[]. There aren't many reasons to have aInteger[]
With that, you can really simplify this (using java 8):
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toList;
.....
static final String FORMAT = "%s: count=%s, indices=%s%n";
public static void duplicatesInArray(int[] ary) {
IntStream.range(0,ary.length).boxed()
.collect(groupingBy(i -> ary[i], toList()))
.forEach((num, lst) -> System.out.printf(FORMAT, num, lst.size(), lst));
}Code Snippets
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toList;
.....
static final String FORMAT = "%s: count=%s, indices=%s%n";
public static void duplicatesInArray(int[] ary) {
IntStream.range(0,ary.length).boxed()
.collect(groupingBy(i -> ary[i], toList()))
.forEach((num, lst) -> System.out.printf(FORMAT, num, lst.size(), lst));
}Context
StackExchange Code Review Q#102275, answer score: 8
Revisions (0)
No revisions yet.