【问题标题】:Filter and use text out of a txt file过滤和使用 txt 文件中的文本
【发布时间】:2018-11-26 13:00:53
【问题描述】:

我想对其进行过滤,使其仅使用 PART 和 FUNCTION 的每种不同组合的最新信息,这样我最终每个组合只会获得大约少数结果,而不是数千个过时的结果。 此处的 ID 是基于时间的。

这是我目前得到的:

    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);
        }
    }

所以目前我的 ID 等于特定日期和时间,我希望它是该特定组合(chw 和磁盘使用)的最高 ID。

我想做一些类似的事情

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

【问题讨论】:

  • 像您的问题一样,您的地图中将有 4 个值,它们基本上只代表一个数据集,由单个 ID、单个 组成FUNCTION、一个PART和一个STATE。那是你想要的吗?您无法正确过滤它,因为它只有 4 个完全不同的值...查看@JBNizet 的答案并为每个数据集创建一个对象。这些可以从MapList 过滤。

标签: java list dictionary


【解决方案1】:

创建一个类RowKey,使用partfunction,并正确覆盖equalshashCode(IDE 可以为您生成)。

创建一个类Row,带有一个rowKeyRowKey 类型)、一个id 和一个state

为每个行键创建一个Map&lt;RowKey, Row&gt;,其中包含具有最大 ID 的行(最初为空)。

遍历文件的行。为每一行创建一个 Row 实例。

然后检查该行键的映射中是否已存在条目。如果不是,或者如果新行的 ID 比现有行大,则将新行存储在地图中。 Map.merge 可以帮助您做到这一点。

最后,地图的值包含你想要的。

实现留给读者作为练习。

【讨论】:

  • “创建一个类 RowKey,包含一个部分和一个信息,以及适当的等号和 hashCode 覆盖(IDE 可以为您生成)。”我假设你的意思是一个“部分”和一个“功能”,或者你想让我用信息做什么(这是我的一段代码中的 C 样式数组)?
  • 是的,很抱歉造成混乱。现已修复。
【解决方案2】:
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);

【讨论】:

    猜你喜欢
    • 2020-10-07
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多