我有一个字符串和字符串的映射,其中有键/值对,如下所示。对于每个客户端_123
,我将有两个键,其值如下所示。
test_client_123=7|0.1|0.2|0.3|0.3
test_abc_pqr_client_123=16|5.5562501|5.1999998|13.6000004|13.6000004
test_client_987=9|0.3|0.4|0.7|0.7
test_abc_pqr_client_987=10|2.222|3.333|4.567|7.876
这只是一个例子,我将有更多相同html" target="_blank">格式的键/值对。唯一的区别是客户机_123
将是其他一些客户机,如客户机_543
,=
之后,管道中的编号也可能不同。这就是全部。
管道分隔格式中的每个值是什么意思:这里7是计数,0.1是平均值,0.2是中位数,0.3是第95个百分位数,0.3也是第99个百分位数。第二行也是如此。它将始终采用这种格式。
问题陈述:
对于这一行test_client_123=7 | 0.1 | 0.2 | 0.3 | 0.3
,我需要创建以下新的键/值对,并将其加载到同一映射中:
test_in_process_client_123_count=7
test_in_process_client_123_avg_in_ms=0.1
test_in_process_client_123_median_in_ms=0.2
test_in_process_client_123_95_in_ms=0.3
test_in_process_client_123_99_in_ms=0.3
同样,对于这行test_abc_pqr_client_123=16|5.5562501|5.1999998|13.6000004|13.6000004
,我想在下面创建新的键/值对并将其加载到同一映射中:
test_abc_pqr_client_123_count=16
test_abc_pqr_client_123_avg_in_ms=5.5562501
test_abc_pqr_client_123_median_in_ms=5.1999998
test_abc_pqr_client_123_95_in_ms=13.6000004
test_abc_pqr_client_123_99_in_ms=13.6000004
我怎样才能做到这一点?下面是我在地图中加载所有原始键/值对的代码:
String response = restTemplate.getForObject(url, String.class);
Matcher m = PATTERN.matcher(response);
while (m.find()) {
metricHolder.put(m.group(1), m.group(2));
}
现在这个metricHolder
映射将具有上面的原始键和管道分隔值。现在我想在同一个metricHolder
映射中加载新的键/值对,并在我们将它们转换为新的键/值对后从映射中删除原始键/值对。
如果我正确理解了您的问题,您必须使用“|”(pipe)作为分隔符解析出当前映射中的值条目,然后将每个解析后的值作为键值对放回去。下面是这样的代码:
String test_client_123="7|0.1|0.2|0.3|0.3" ;
Map<String, String> the_map = new HashMap<String, String>() ;
the_map.clear() ;
String[] values = test_client_123.split("\\|");
for (int i = 0; i < values.length; i++) {
if (i == 0)
the_map.put("count", values[i]);
else if (i == 1)
the_map.put("avg_in_ms", values[i]);
else if (i == 2)
the_map.put("med_in_ms", values[i]);
else if (i == 3)
the_map.put("95_in_ms", values[i]);
else if (i == 4)
the_map.put("99_in_ms", values[i]);
}
希望对你有帮助...
有趣的问题要解决,我拿出了我自己的解决方案,希望它能帮助你或者对你正在尝试做的事情有用,如果我很好地理解你想在你的地图上添加新的记录,基于以前的条目,那么这就是我所做的:
public class DictionaryProcessor {
//Suffixes and common String parts
final static String PROCESS = "_in_process_";
final static String COUNT = "_count";
final static String AVG_IN_MS = "_avg_in_ms";
final static String MEDIAN_IN_MS = "_median_in_ms";
final static String N95_IN_MS = "_95_in_ms";
final static String N99_IN_MS = "_99_in_ms";
final static String PQR = "_pqr_";
public static void main(String[] args) {
//Assuming this is the data you have:
Map<String, String> dictionaryMap = new HashMap<String, String>();
dictionaryMap.put("test_client_123", "7|0.1|0.2|0.3|0.3");
dictionaryMap.put("test_abc_pqr_client_123", "16|5.5562501|5.1999998|13.6000004|13.6000004");
dictionaryMap.put("test_client_987", "9|0.3|0.4|0.7|0.7");
dictionaryMap.put("test_abc_pqr_client_987", "10|2.222|3.333|4.567|7.876");
//I will define a temporary map to hold the new values
Map<String, String> tempMap = new HashMap<String, String>();
//We will iterate our map
for (Map.Entry<String, String> entry : dictionaryMap.entrySet()) {
String currentKey = entry.getKey();//Get the current key
String currentValue = entry.getValue();//Get the current value for the key
//Since the value has the data separated by "|", I'd like to use "StringTokenizer" (Split or regex are worth to use to)
StringTokenizer tokenizer = new StringTokenizer(currentValue, "|");
String count = tokenizer.nextToken().trim();
String avgData = tokenizer.nextToken().trim();
String medianData = tokenizer.nextToken().trim();
String n95data = tokenizer.nextToken().trim();
String n99data = tokenizer.nextToken().trim();
tempMap.put(generateNewKey(currentKey, currentKey.contains(PQR), COUNT), count);
tempMap.put(generateNewKey(currentKey, currentKey.contains(PQR), AVG_IN_MS), avgData);
tempMap.put(generateNewKey(currentKey, currentKey.contains(PQR), MEDIAN_IN_MS), medianData);
tempMap.put(generateNewKey(currentKey, currentKey.contains(PQR), N95_IN_MS), n95data);
tempMap.put(generateNewKey(currentKey, currentKey.contains(PQR), N99_IN_MS), n99data);
}
//Iterate the temporary map and add it to the existing dictionary map
for (Map.Entry<String, String> entry : tempMap.entrySet()) {
dictionaryMap.put(entry.getKey(), entry.getValue());
}
printMap(dictionaryMap);
}
private static void printMap(Map<String, String> targetMap) {
for (Map.Entry<String, String> entry : targetMap.entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
}
private static String generateNewKey(String currentKey, boolean hasPQR,
String constant) {
StringBuilder newKey = new StringBuilder();
if (hasPQR) {
newKey.append(currentKey).append(constant);
} else {
String firstPart = currentKey.substring(0, currentKey.indexOf("_"));
String secondPart = currentKey.substring(currentKey.lastIndexOf("_") + 1, currentKey.length());
newKey.append(firstPart).append(PROCESS).append(secondPart).append(constant);
}
return newKey.toString();
}
}
希望有用。快乐编码:)
问题内容: 我下面有String,其格式需要将其加载到地图中,因此我需要在逗号上分割,然后加载为键及其值。 我在这里使用Splitter为我完成这项工作,但在某些情况下失败了。对于我的某些字符串,value具有一些带等号的字符串。所以对于下面的字符串,它对我来说是失败的: 如何使它适用于上述情况?对于上述情况,将为,值应为。这可能吗? 问题答案: 您可以添加一个数字来表示要拆分多少个,只需添加2个
问题内容: 我正在使用一种API,该API为我提供了XML,并且我需要从一个实际上是字符串的标签中获取一张地图。例: 有 我需要 问题在于字符串是完全动态的,因此它可以像 所以我不能只用逗号然后用等号分开。是否可以使用正则表达式将类似字符串的内容转换为地图? 到目前为止,我的代码是: 先感谢您 问题答案: 您可以使用 请参阅regex演示。 细节 -第1组:一个或多个单词字符 -等号 -第2组:除
Adds or retrieves given value associated with given key. (Don’t confuse with data- attributes) See also Element.removeData Parameters keystringkey to store data valueanyvalue to store Returns: objectE
设置元素属性。需要注意的是,应该始终调用该方法来修改属性,而不是直接 element.xxx = ... 这样的形式,因为后者不会重绘物体。 参数 名称 类型 默认值 描述 key string|Object 设置的属性。可以是 string 类型的属性名称,或者 Object 类型的属性及其值。 value * 属性值。 例子 element.attr('position', [100, 200
我使用放心java,我使用post Request来获得响应。从我的代码中,我能够得到响应,我看到在响应中,我看到我要存储的值存在于键集中。这是示例: 在上面的示例中,我使用Json路径解析表达式,我希望使用值“A”从中提取键(“345”)。 当我使用上面的代码时,它抛出一个错误,但是当我运行下面的代码时。 我得到的输出是A。我知道什么是[A,b,c,d,e,f],但我不知道什么是[A,b、c,d
在很多情况下,日志内容本身都是一个类似于 key-value 的格式,但是格式具体的样式却是多种多样的。logstash 提供 filters/kv 插件,帮助处理不同样式的 key-value 日志,变成实际的 LogStash::Event 数据。 配置示例 filter { ruby { init => "@kname = ['method','uri','verb'