更改List <string>中的String基于另一个String相同的List Java

时间:2015-06-30 20:48:09

标签: java string list dictionary collections

我有一个包含String的List:

device0001;sale;2013-01-01 00:00:00;30.45
device0001;sale;2013-01-02 00:00:00;41.02
device0001;sale;2013-01-03 00:00:00;30.45
...
device0001;saleCode;2013-01-01 00:00:00;10
device0001;saleCode;2013-01-02 00:00:00;55
device0001;saleCode;2013-01-03 00:00:00;55

多个设备,多个CodeName和Date by Device。我想将saleCode的值映射到销售代码名称。 我最终想要的例子:

device0001;10;2013-01-01 00:00:00;30.45
device0001;55;2013-01-02 00:00:00;41.02
device0001;55;2013-01-03 00:00:00;30.45

可以保留或不保留saleCode字符串,这没关系。

我已经使用2 for for循环和ifs,但是处理时间太长了。

我想过要建立这样的东西:

Map<String(device), Map<DateTime, Map<String(element), String(value)>>>

forEach device
    forEach datetime
        element (Codename substring) and replace by element (Value substring)

我非常确定必须有更好和/或更优雅的方式来做到这一点。

编辑 - 因为我似乎并不清楚我为什么要这么做,所以这里是for和if的代码(这太慢了):

    for (String line : lines) {
        if (line.split(SEPARATOR)[4].equals("sale")) {
            for (String codeLine : lines) {
                if (codeLine.split(SEPARATOR)[5].equals(line.split(SEPARATOR)[5]) &&        
                    codeLine.split(SEPARATOR)[1].equals(line.split(SEPARATOR)[1])&& 
                    codeLine.split(SEPARATOR)[4].equals("saleCode")) {

                    line = line.replaceAll("sale", codeLine.split(SEPARATOR)[7]); 
                }
            }
         }
    }

索引不适合我的字符串示例,因为还有其他非重要字段,但索引[1]是设备编号,[5]是日期。 [4]是类型(sale,saleCode)和[7]的值。

编辑#2

我已经提高了速度:

MultiKeyMap<String, String> multiKeyMap = new MultiKeyMap<>();

for (String line : lines) {
    if (line.split(SEPARATOR)[4].equals("saleCode")) {
        String device = line.split(SEPARATOR)[1];
        String date = line.split(SEPARATOR)[5];
        String value = line.split(SEPARATOR)[7];

        multiKeyMap.put(device, date, value);
     }
}

for (int i = 0; i < lines.size(); i++) {
    String code = lines.get(i).split(SEPARATOR)[4];

    if (code.equals("sale")) {
        String device = lines.get(i).split(SEPARATOR)[1];
        String date = lines.get(i).split(SEPARATOR)[5];
        String newline = lines.get(i).replaceAll("sale", multiKeyMap.get(device, date));

        lines.set(i, newline);
     }
}

我暂时会这样做,但总是愿意接受建议。

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你不需要建立任何地图等 您有一个具有该格式的字符串列表 只需遍历每个字符串并使用正则表达式替换/更新每个字符串。

<强>更新
您的代码很慢,因为您正在为每个字符串反复处理列表。

  1. 根据设备ID创建一个hashmap。
  2. 逐个查看lines中的字符串。
  3. 检查字符串是否存在于hashmap中  如果它不存在,那么检查它是哪种类型的字符串并应用适当的正则表达式进行替换。将字符串添加到hashmap中  如果确实存在,则使用新遇到的字符串通过正则表达式更新字符串 完成后,hashmap将替换字符串。
  4. 注意:我提到了正则表达式,因为它似乎有一种特定的格式,并且可以通过这种方式轻松有效地编写。如果您不能使用正则表达式,例如您不熟悉它们,请按照您正在进行的逐字符解析方法。当你处理一次列表

    时,它会更好