当前位置: 首页 > 知识库问答 >
问题:

如何解析字符串key/value并从中生成新的key/value并将其加载到同一个映射中?

危斯伯
2023-03-14

我有一个字符串和字符串的映射,其中有键/值对,如下所示。对于每个客户端_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映射中加载新的键/值对,并在我们将它们转换为新的键/值对后从映射中删除原始键/值对。

共有2个答案

燕璞
2023-03-14

如果我正确理解了您的问题,您必须使用“|”(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]);
  }

希望对你有帮助...

葛修筠
2023-03-14

有趣的问题要解决,我拿出了我自己的解决方案,希望它能帮助你或者对你正在尝试做的事情有用,如果我很好地理解你想在你的地图上添加新的记录,基于以前的条目,那么这就是我所做的:

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'