如何在java中将String转换为Hashmap

bq3bfh9z  于 2023-03-21  发布在  Java
关注(0)|答案(9)|浏览(437)

如何将String转换为HashMap

String value = "{first_name = naresh, last_name = kumar, gender = male}"

变成

Map<Object, Object> = {
    first_name = naresh,
    last_name = kumar,
    gender = male
}

其中键为first_namelast_namegender,值为nareshkumarmale

**注意:**密钥可以是city = hyderabad之类的任何东西。

我正在寻找一种通用的方法。

0s7z1bwu

0s7z1bwu1#

这是一个解决方案。如果你想让它更通用,你可以使用StringUtils库。

String value = "{first_name = naresh,last_name = kumar,gender = male}";
value = value.substring(1, value.length()-1);           //remove curly brackets
String[] keyValuePairs = value.split(",");              //split the string to creat key-value pairs
Map<String,String> map = new HashMap<>();               

for(String pair : keyValuePairs)                        //iterate over the pairs
{
    String[] entry = pair.split("=");                   //split the pairs to get key and value 
    map.put(entry[0].trim(), entry[1].trim());          //add them to the hashmap and trim whitespaces
}

例如,您可以切换

value = value.substring(1, value.length()-1);

value = StringUtils.substringBetween(value, "{", "}");

如果您使用的是StringUtils,它包含在apache.commons.lang包中。

sdnqo3pr

sdnqo3pr2#

你可以在一行中完成,对于任何对象类型,而不仅仅是Map。

(由于我非常自由地使用Gson,因此我将分享一种基于Gson的方法)

Gson gson = new Gson();    
Map<Object,Object> attributes = gson.fromJson(gson.toJson(value),Map.class);

它的作用是:

  1. gson.toJson(value)会将你的对象序列化为等价的Json表示。
  2. gson.fromJson将Json字符串转换为指定的对象。(在本例中-Map
    这种方法有两个优点:
    1.灵活地将Object而不是String传递给toJson方法。
    1.您可以使用这一行转换为任何对象,甚至是您自己声明的对象。
mi7gmzs6

mi7gmzs63#

String value = "{first_name = naresh,last_name = kumar,gender = male}"

我们开始吧
1.从String中删除{}〉〉first_name = naresh,last_name = kumar,gender = male
1.从,〉〉3个元素的数组中拆分String
1.现在,您有一个包含3元素的array
1.迭代array并将每个元素按=拆分
1.创建一个Map<String,String>,将每个部分用=分隔。第一部分为Key,第二部分为Value

iibxawm4

iibxawm44#

@Test
public void testToStringToMap() {
    Map<String,String> expected = new HashMap<>();
    expected.put("first_name", "naresh");
    expected.put("last_name", "kumar");
    expected.put("gender", "male");
    String mapString = expected.toString();
    Map<String, String> actual = Arrays.stream(mapString.replace("{", "").replace("}", "").split(","))
            .map(arrayData-> arrayData.split("="))
            .collect(Collectors.toMap(d-> ((String)d[0]).trim(), d-> (String)d[1]));

    expected.entrySet().stream().forEach(e->assertTrue(actual.get(e.getKey()).equals(e.getValue())));
}
yfjy0ee7

yfjy0ee75#

试试这个:)

public static HashMap HashMapFrom(String s){
    HashMap base = new HashMap(); //result
    int dismiss = 0; //dismiss tracker
    StringBuilder tmpVal = new StringBuilder(); //each val holder
    StringBuilder tmpKey = new StringBuilder(); //each key holder

    for (String next:s.split("")){ //each of vale
        if(dismiss==0){ //if not writing value
            if (next.equals("=")) //start writing value
                dismiss=1; //update tracker
            else
                tmpKey.append(next); //writing key
        } else {
            if (next.equals("{")) //if it's value so need to dismiss
                dismiss++;
            else if (next.equals("}")) //value closed so need to focus
                dismiss--;
            else if (next.equals(",") //declaration ends
                    && dismiss==1) {
                //by the way you have to create something to correct the type
                Object ObjVal = object.valueOf(tmpVal.toString()); //correct the type of object
                base.put(tmpKey.toString(),ObjVal);//declaring
                tmpKey = new StringBuilder();
                tmpVal = new StringBuilder();
                dismiss--;
                continue; //next :)
            }
            tmpVal.append(next); //writing value
        }
    }
    Object objVal = object.valueOf(tmpVal.toString()); //same as here
    base.put(tmpKey.toString(), objVal); //leftovers
    return base;
}

示例输入:“a=0,B={a=1},c={ew={qw=2}},0 =a”输出:{0=a,a=0,B={a=1},c={ew={qw=2}}}

xmd2e60i

xmd2e60i6#

应该使用这种方式转换成Map:

String student[] = students.split("\\{|}");
    String id_name[] = student[1].split(",");

    Map<String,String> studentIdName = new HashMap<>();

    for (String std: id_name) {
        String str[] = std.split("=");
        studentIdName.put(str[0],str[1]);
  }
vdgimpew

vdgimpew7#

You can use below library to convert any string to Map object.

<!-- https://mvnrepository.com/artifact/io.github.githubshah/gsonExtension -->
<dependency>
    <groupId>io.github.githubshah</groupId>
    <artifactId>gsonExtension</artifactId>
    <version>4.1.0</version>
</dependency>
p1iqtdky

p1iqtdky8#

使用Java流:

Map<String, String> map = Arrays.stream(value.replaceAll("[{}]", " ").split(","))
                .map(s -> s.split("=", 2))
                .collect(Collectors.toMap(s -> s[0].trim(), s -> s[1].trim()));
  1. Arrays.stream()将字符串数组转换为流。
  2. replaceAll("[{}]", " "):正则表达式版本来替换两个大括号。
  3. split(","):将字符串拆分为,以获得单独的Map条目。
  4. s.split("=", 2):通过=拆分它们以获得键和值,并确保数组永远不会超过两个元素。
  5. Stream API中的collect()方法从流对象中收集所有对象,并存储在集合的类型中。
  6. Collectors.toMap(s -> s[0].trim(), s -> s[1].trim()):将元素累加到Map中,该Map的键和值是将提供的Map函数应用于输入元素的结果。
44u64gxh

44u64gxh9#

令人惊讶的是没有人提到使用JSONObject(org.json.JSONObject)

JSONObject json = new JSONObject(mapStr);
        Map<String,Object> map = json.toMap();

比编写自己的解析器好得多吗?

相关问题