Есть много способов решить эту проблему. Лично я бы попробовал самое простое решение. Я не знаю всего контекста вашего проекта и его видения, однако, основываясь на информации, которую вы нам предоставили, я публикую решение, которое я бы выбрал.
Примечание : Следующие классы могут быть неполными. Возможно, вам придется добавить больше методов, чтобы их было легче использовать. Это просто идея решения, изложенная в коде, которая может сработать для вас.
Класс Pair
моделирует пару строки и ее значение пригодности. Класс Population
моделирует популяцию определенного поколения. Он сохраняет свои элементы в списке и предоставляет методы для управления списком. Это также позволяет дублировать пары. Вы можете выбрать верхних или нижних X
членов популяции и оперировать с ними.
public class Pair implements Comparable<Pair>{
private final String value;
private final int fitness;
public Pair(String value, int fitness) {
this.value = value;
this.fitness = fitness;
}
public String getValue() {
return value;
}
public int getFitness() {
return fitness;
}
@Override
public int compareTo(Pair pair) {
return -Integer.compare(this.fitness, pair.fitness);
}
@Override
public String toString() {
return "Pair{" + "value='" + value + '\'' + ", fitness=" + fitness + '}';
}
}
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class Population {
private final List<Pair> members = new ArrayList<>();
public void addMember(Pair pair) {
members.add(pair);
}
public List<Pair> getTop(int x) {
return members.stream().sorted().limit(x).collect(Collectors.toList());
}
public List<Pair> getBottom(int x) {
return members.stream().sorted(Comparator.reverseOrder()).limit(x).collect(Collectors.toList());
}
}
А вот неполный тестовый класс:
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
class PopulationTest {
Population population = new Population();
@BeforeEach
void populate() {
population.addMember(new Pair("test", 5));
population.addMember(new Pair("abc", 13));
population.addMember(new Pair("xyz", 8));
population.addMember(new Pair("abc", 20));
}
@Test
void testSortDescending() {
List<Pair> members = population.getTop(4);
for (int i = 0; i < members.size() - 1; i++) {
assertTrue(members.get(i).getFitness() >= members.get(i + 1).getFitness());
}
}
@Test
void testGetTop() {
List<Pair> top = population.getTop(2);
assertEquals(20, top.get(0).getFitness());
assertEquals(13, top.get(1).getFitness());
}
@Test
void testGetBottom() {
List<Pair> bottom = population.getBottom(2);
assertEquals(5, bottom.get(0).getFitness());
assertEquals(8, bottom.get(1).getFitness());
}
}