Сначала я создал простой POJO для хранения количества и данных позиции (вся строка).
private static class Item {
private int quantity;
private String itemData;
private Item(String itemData, int quantity) {
this.itemData = itemData;
this.quantity = quantity;
}
public int getQuantity() {
return quantity;
}
public String getItemData() {
return itemData;
}
}
Считайте каждый элемент (принадлежащий к желаемой группе) и извлеките количество.Создайте объект Item для каждой строки с этими данными.
Далее сортируйте элементы по количеству (Comparator.comparing(Item::getQuantity)
).
При этом все элементы будут отсортированы по количеству,Осталось только распечатать 5 верхних пунктов этого списка.
List<Item> items = new ArrayList<>();
String lineRead;
FileReader fileReader = null;
try {
fileReader = new FileReader("...");
} catch (FileNotFoundException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
BufferedReader bufferedReader = new BufferedReader(fileReader);
Pattern pattern = Pattern.compile("Quantity : (\\d+)");
while ((lineRead = bufferedReader.readLine()) != null) {
if (lineRead.contains(("Group ID : " + groupId))) {
Matcher matcher = pattern.matcher(lineRead);
int quantity;
if (matcher.find())
{
quantity = Integer.parseInt(matcher.group(1));
} else {
throw new RuntimeException("Unexpected data format. Quantity not found");
}
Item item = new Item(lineRead, quantity);
items.add(item);
}
}
items.sort(Comparator.comparing(Item::getQuantity));
items.stream()
.limit(5)
.forEach(item -> System.out.println(item.getItemData()));
Регулярное выражение Quantity : (\\d+)
соответствует строкам, имеющим слово Quantity
, за которым следует число.Получив 1-ю подходящую группу, мы получим только значение величины.
Ссылка на метод сравнения является просто элегантным представлением традиционного компаратора.
items.sort(new Comparator<Item>() {
@Override
public int compare(Item o1, Item o2) {
return Double.compare(o1.getQuantity(), o2.getQuantity());
}
});