Как получить 5 пунктов на основе минимального количества из текстового файла - PullRequest
0 голосов
/ 28 сентября 2019

Я хочу получить доступ к 5 элементам группы с минимальным количеством из текстового файла

Я могу получить доступ к первым 5 элементам из группы, но не к минимальным из этой конкретной группы

        List<String> itemsWithMinQuantity = new ArrayList<String>();
        String lineRead;
        int requiredItemsInGroup = 5;
        FileReader fileReader = null;
        try {
            fileReader = new FileReader("file path");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        BufferedReader bufferedReader = new BufferedReader(fileReader);
        while ((lineRead = bufferedReader.readLine()) != null) {
            if (lineRead.contains(("Group ID : " + groupID))) {

                if (requiredItemsInGroup != 0) {
                    itemsWithMinQuantity.add(lineRead);
                } else {
                    break;

                }
                requiredItemsInGroup--;
            }
        }

        if (itemsWithMinQuantity.isEmpty()) {
            return Collections.singletonList("No items in entered group No.");

        } else {
            return itemsWithMinQuantity;
        }
    }

Ожидается: он должен вернуть нам 5 предметов вместе с их идентификатором группы и количеством на основе минимального количества из группы

Фактический

"Group ID : 1 Quantity : 5 Item Title : MUCHAE NAMUL (DAIKON)",

"Group ID : 1 Quantity : 0 Item Title : LUSH LEMON DRIZZLE!",

"Group ID : 1 Quantity : 0 Item Title : CHOCOLATE GRAVY",

"Group ID : 1 Quantity : 0 Item Title : MICHAEL SYMON'S CHICKEN CUTLET MILANESE WITH ARUGULA SALAD",

"Group ID : 1 Quantity : 0 Item Title : CLASSIC BEEF BRAISE"

1 Ответ

0 голосов
/ 28 сентября 2019

Сначала я создал простой 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());
    }
});
...