Java 如何在最小数量的基础上从txt文件中获取5项

Java 如何在最小数量的基础上从txt文件中获取5项,java,file-handling,Java,File Handling,我想从文本文件中访问组中具有最小数量的5项 我能够访问组中的前5个项目,但不能访问该特定组中的最小项目 List<String> itemsWithMinQuantity = new ArrayList<String>(); String lineRead; int requiredItemsInGroup = 5; FileReader fileReader = null; try {

我想从文本文件中访问组中具有最小数量的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;
        }
    }

首先,我创建了一个简单的POJO来保存数量和项目数据(整行)

阅读每个项目(属于所需组)并提取数量。使用此数据为每行创建一个Item对象

接下来,按数量计数对项目进行排序(
Comparator.comparating(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()));

您必须读取属于该组id的所有项目,并按数量对其进行排序,以提取前5个项目。我应该这样做吗@user7首先将文件中的所有内容读取到列表中,然后在该列表中找到5项。这比一步到位容易得多
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;
    }
}
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()));
items.sort(new Comparator<Item>() {
    @Override
    public int compare(Item o1, Item o2) {
        return Double.compare(o1.getQuantity(), o2.getQuantity());
    }
});