Фильтровать и использовать текст из текстового файла - PullRequest
0 голосов
/ 26 ноября 2018

Я хочу отфильтровать ее так, чтобы она использовала только самую свежую информацию для каждой отдельной комбинации PART и FUNCTION, чтобы в результате я получил лишь несколько результатов на одну комбинацию вместо тысяч устаревших.Идентификатор основан на времени здесь.

Это то, что у меня сейчас есть:

    while((line = br.readLine())!= null){ 
        info = line.split(",");

        Map<String,String> qgi=new HashMap<String,String>();

        qgi.put("ID",info[0]);
        qgi.put("FUNCTION",info[1]);
        qgi.put("PART",info[2]);
        qgi.put("STATE",info[3]);
        sourceList.add(qgi);
    }

    for (int i = 0, len = sourceList.size(); i < len; i++) {
        Map<String,String> gqi =(Map) sourceList.get(i);

        if ( gqi.get("PART").equals("chw") && gqi.get("FUNCTION").equals("diskusage") && gqi.get("ID").equals("20181122125601"))//Get highest value with those parameters
        { 
            resultList.add(gqi);
        }
    }

Так что в настоящее время мой идентификатор равен конкретной дате и времени, и я хочу, чтобы он был самым высокимИдентификатор этой конкретной комбинации (chw и diskusage).

Я хочу сделать что-то вроде

if(a.get("b").equals("something") && a.get("c").equals("something") && thisCombinationsID >= everyOtherIDWithThisCombination{
    resultList.add(a);
}

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018
final class Data {

    private int id;
    private final String function;
    private final String part;
    private final String state;

    public Data(String id, String function, String part, String state) {
        this.id = Integer.parseInt(id);
        this.function = function;
        this.part = part;
        this.state = state;
    }
}

List<Data> sourceList = new ArrayList<>();

while ((line = br.readLine()) != null) {
    String[] info = line.split(",");
    sourceList.add(new Data(info[0], info[1], info[2], info[3]));
}

final Predicate<Data> specificCombination = data -> "something".equals(data.function) && "something".equals(data.part);
final Comparator<Data> compareByIdDesc = (d1, d2) -> Integer.compare(d2.id, d1.id);
Data data = sourceList.stream().filter(specificCombination).min(compareByIdDesc).orElse(null);
0 голосов
/ 26 ноября 2018

Создайте класс RowKey с part и function и соответствующими equals и hashCode переопределениями (IDE может сгенерировать это для вас).

Создайте класс Row, с rowKey (типа RowKey), id и state.

Создайте Map<RowKey, Row>, содержащую для каждого ключа строки строку с максимальным идентификатором (изначально пустую).

Выполните итерации по строкам файла.Для каждой строки создайте экземпляр строки.

Затем проверьте, существует ли уже запись на карте для этого ключа строки.Если нет, или если новая строка имеет больший идентификатор, чем существующая строка, сохраните новую строку на карте.Map.merge может помочь в этом.

В конце значения карты содержат то, что вы хотите.

Реализация оставлена ​​в качестве упражнения для читателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...