我有一个包含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);
}
}
我暂时会这样做,但总是愿意接受建议。
答案 0 :(得分:0)
如果我理解你的问题,你不需要建立任何地图等 您有一个具有该格式的字符串列表 只需遍历每个字符串并使用正则表达式替换/更新每个字符串。
<强>更新强>
您的代码很慢,因为您正在为每个字符串反复处理列表。
lines
中的字符串。注意:我提到了正则表达式,因为它似乎有一种特定的格式,并且可以通过这种方式轻松有效地编写。如果您不能使用正则表达式,例如您不熟悉它们,请按照您正在进行的逐字符解析方法。当你处理一次列表
时,它会更好