Skip to content

Commit 04e1e1b

Browse files
author
helga_sh
committed
Top k elements in an array
1 parent cd2f453 commit 04e1e1b

5 files changed

Lines changed: 126 additions & 0 deletions

File tree

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.baeldung.algorithms.topnelements;
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+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.baeldung.algorithms.topnelements;
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+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.baeldung.algorithms.topnelements;
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+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.baeldung.algorithms.topnelements;
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+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.baeldung.algorithms.topkelements;
2+
3+
import com.baeldung.algorithms.topnelements.BruteForceTopKElementsFinder;
4+
import com.baeldung.algorithms.topnelements.MaxHeapTopKElementsFinder;
5+
import com.baeldung.algorithms.topnelements.TopKElementsFinder;
6+
import com.baeldung.algorithms.topnelements.TreeSetTopKElementsFinder;
7+
import org.junit.Test;
8+
9+
import java.util.Arrays;
10+
import java.util.List;
11+
12+
import static org.assertj.core.api.Java6Assertions.assertThat;
13+
14+
public class TopKElementsFinderUnitTest {
15+
private final TopKElementsFinder<Integer> bruteForceFinder = new BruteForceTopKElementsFinder();
16+
private final TopKElementsFinder<Integer> maxHeapFinder = new MaxHeapTopKElementsFinder();
17+
private final TopKElementsFinder<Integer> treeSetFinder = new TreeSetTopKElementsFinder();
18+
19+
private final int k = 4;
20+
private final List<Integer> distinctIntegers = Arrays.asList(1, 2, 3, 9, 7, 6, 12);
21+
private final List<Integer> distinctIntegersTopK = Arrays.asList(9, 7, 6, 12);
22+
private final List<Integer> nonDistinctIntegers = Arrays.asList(1, 2, 3, 3, 9, 9, 7, 6, 12);
23+
private final List<Integer> nonDistinctIntegersTopK = Arrays.asList(9, 9, 7, 12);
24+
25+
26+
@Test
27+
public void givenArrayDistinctIntegers_whenBruteForceFindTopK_thenReturnKLargest() {
28+
assertThat(bruteForceFinder.findTopK(distinctIntegers, k)).containsOnlyElementsOf(distinctIntegersTopK);
29+
}
30+
31+
@Test
32+
public void givenArrayDistinctIntegers_whenMaxHeapFindTopK_thenReturnKLargest() {
33+
assertThat(maxHeapFinder.findTopK(distinctIntegers, k)).containsOnlyElementsOf(distinctIntegersTopK);
34+
}
35+
36+
@Test
37+
public void givenArrayDistinctIntegers_whenTreeSetFindTopK_thenReturnKLargest() {
38+
assertThat(treeSetFinder.findTopK(distinctIntegers, k)).containsOnlyElementsOf(distinctIntegersTopK);
39+
}
40+
41+
@Test
42+
public void givenArrayNonDistinctIntegers_whenBruteForceFindTopK_thenReturnKLargest() {
43+
assertThat(bruteForceFinder.findTopK(nonDistinctIntegers, k)).containsOnlyElementsOf(nonDistinctIntegersTopK);
44+
}
45+
46+
@Test
47+
public void givenArrayNonDistinctIntegers_whenMaxHeapFindTopK_thenReturnKLargest() {
48+
assertThat(maxHeapFinder.findTopK(nonDistinctIntegers, k)).containsOnlyElementsOf(nonDistinctIntegersTopK);
49+
}
50+
}

0 commit comments

Comments
 (0)