Skip to content

Commit cf643dc

Browse files
Merge pull request eugenp#9652 from HelgaShiryaeva/top-k-elements-of-an-array
Top k elements of an array
2 parents 2b9260b + 5456bb5 commit cf643dc

File tree

5 files changed

+122
-0
lines changed

5 files changed

+122
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.baeldung.algorithms.topkelements;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
public class BruteForceTopKElementsFinder implements TopKElementsFinder<Integer> {
7+
8+
public List<Integer> findTopK(List<Integer> input, int k) {
9+
List<Integer> array = new ArrayList<>(input);
10+
List<Integer> topKList = new ArrayList<>();
11+
12+
for (int i = 0; i < k; i++) {
13+
int maxIndex = 0;
14+
15+
for (int j = 1; j < array.size(); j++) {
16+
if (array.get(j) > array.get(maxIndex)) {
17+
maxIndex = j;
18+
}
19+
}
20+
21+
topKList.add(array.remove(maxIndex));
22+
}
23+
24+
return topKList;
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.baeldung.algorithms.topkelements;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.List;
6+
import java.util.PriorityQueue;
7+
8+
public class MaxHeapTopKElementsFinder implements TopKElementsFinder<Integer> {
9+
10+
public List<Integer> findTopK(List<Integer> input, int k) {
11+
PriorityQueue<Integer> maxHeap = new PriorityQueue<>();
12+
13+
input.forEach(number -> {
14+
maxHeap.add(number);
15+
16+
if (maxHeap.size() > k) {
17+
maxHeap.poll();
18+
}
19+
});
20+
21+
List<Integer> topKList = new ArrayList<>(maxHeap);
22+
Collections.reverse(topKList);
23+
24+
return topKList;
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.baeldung.algorithms.topkelements;
2+
3+
import java.util.List;
4+
5+
public interface TopKElementsFinder<T extends Comparable<T>> {
6+
List<T> findTopK(List<T> input, int k);
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.baeldung.algorithms.topkelements;
2+
3+
import java.util.Comparator;
4+
import java.util.List;
5+
import java.util.Set;
6+
import java.util.TreeSet;
7+
import java.util.stream.Collectors;
8+
9+
public class TreeSetTopKElementsFinder implements TopKElementsFinder<Integer> {
10+
11+
public List<Integer> findTopK(List<Integer> input, int k) {
12+
Set<Integer> sortedSet = new TreeSet<>(Comparator.reverseOrder());
13+
sortedSet.addAll(input);
14+
15+
return sortedSet.stream().limit(k).collect(Collectors.toList());
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.baeldung.algorithms.topkelements;
2+
3+
import org.junit.Test;
4+
5+
import java.util.Arrays;
6+
import java.util.List;
7+
8+
import static org.assertj.core.api.Java6Assertions.assertThat;
9+
10+
public class TopKElementsFinderUnitTest {
11+
private final TopKElementsFinder<Integer> bruteForceFinder = new BruteForceTopKElementsFinder();
12+
private final TopKElementsFinder<Integer> maxHeapFinder = new MaxHeapTopKElementsFinder();
13+
private final TopKElementsFinder<Integer> treeSetFinder = new TreeSetTopKElementsFinder();
14+
15+
private final int k = 4;
16+
private final List<Integer> distinctIntegers = Arrays.asList(1, 2, 3, 9, 7, 6, 12);
17+
private final List<Integer> distinctIntegersTopK = Arrays.asList(9, 7, 6, 12);
18+
private final List<Integer> nonDistinctIntegers = Arrays.asList(1, 2, 3, 3, 9, 9, 7, 6, 12);
19+
private final List<Integer> nonDistinctIntegersTopK = Arrays.asList(9, 9, 7, 12);
20+
21+
22+
@Test
23+
public void givenArrayDistinctIntegers_whenBruteForceFindTopK_thenReturnKLargest() {
24+
assertThat(bruteForceFinder.findTopK(distinctIntegers, k)).containsOnlyElementsOf(distinctIntegersTopK);
25+
}
26+
27+
@Test
28+
public void givenArrayDistinctIntegers_whenMaxHeapFindTopK_thenReturnKLargest() {
29+
assertThat(maxHeapFinder.findTopK(distinctIntegers, k)).containsOnlyElementsOf(distinctIntegersTopK);
30+
}
31+
32+
@Test
33+
public void givenArrayDistinctIntegers_whenTreeSetFindTopK_thenReturnKLargest() {
34+
assertThat(treeSetFinder.findTopK(distinctIntegers, k)).containsOnlyElementsOf(distinctIntegersTopK);
35+
}
36+
37+
@Test
38+
public void givenArrayNonDistinctIntegers_whenBruteForceFindTopK_thenReturnKLargest() {
39+
assertThat(bruteForceFinder.findTopK(nonDistinctIntegers, k)).containsOnlyElementsOf(nonDistinctIntegersTopK);
40+
}
41+
42+
@Test
43+
public void givenArrayNonDistinctIntegers_whenMaxHeapFindTopK_thenReturnKLargest() {
44+
assertThat(maxHeapFinder.findTopK(nonDistinctIntegers, k)).containsOnlyElementsOf(nonDistinctIntegersTopK);
45+
}
46+
}

0 commit comments

Comments
 (0)