使用 StringTokenizer 重新创建 hashmap 会引入无关字符

问题描述 投票:0回答:1

我是 Java 新手,我正在努力了解数组、列表、字符串数组和字符串。

抱歉这篇文章太长了。我已经阅读了教程、文章和书籍,但我显然遗漏了一些东西。

我的项目包含一个显示值的 Gui 应用程序,这些值是从文本文件中获取的。第一遍通过调用第二个类、询问文本文件并将它们返回到 Gui 应用程序来检索文件中的值。

更改后,Gui 应用程序会将数据发送到第二个应用程序,该应用程序应该将更改后的数据中的“键”与文件中的“键”进行匹配。更改的数据位于 KV 哈希映射中,当然作为哈希映射的 String.value 传递。我需要将传递到第二个应用程序的字符串更改回哈希映射,以便“键”访问数据,而不是循环遍历数组直到找到匹配项。

我遇到的问题是,当传入的字符串转换为哈希映射时,哈希映射的值部分包含分隔元素的“,”。

发送哈希映射由 11 行创建,如下所示

cParmValueKv.put("NEWDSFDFT", String.valueOf(newDsfFileRbGrp.getSelection().getActionCommand()));
cParmValueKv.put("XPTPATH", xptoolsAppPathTf.getText());

将其组合并发送的代码 -

// Update the file
        cArgs = new String[11];
        cArgs[0] = "UPDATE";
        cArgs[1] = String.valueOf(cParmValueKv);

        // Go and get the data from the parms file
        XpgwParms.accessFile(cArgs);

我的 ide (IntelliJ) 告诉我变量 cArgs 包含 -

{RUNWEDDFT=Y, INFILEDFT=Y, WEDHLPDFT=Y, ELVUNTDFT=Y, SHWMATDFT=Y, USEWEDDFT=Y, ZIPPATH=C:\7Zip.exe, XPPATH=C:\Users\User\DeskTop\X-Plane\X-Plane Custom Scenery Path, WEDPATH=C:\WED.exe, XPTPATH=XPTOOLS App Path, NEWDSFDFT=Y}

第二个应用程序告诉我收到的数据 (cArgs[1]) 包含 -

{RUNWEDDFT=Y, INFILEDFT=Y, WEDHLPDFT=Y, ELVUNTDFT=Y, SHWMATDFT=Y, USEWEDDFT=Y, ZIPPATH=C:\7Zip.exe, XPPATH=C:\Users\User\DeskTop\X-Plane\X-Plane Custom Scenery Path, WEDPATH=C:\WED.exe, XPTPATH=XPTOOLS App Path, NEWDSFDFT=Y}

我运行此代码来重新创建在 gui 应用程序中创建的哈希映射 -

while (tokenizer.hasMoreTokens()) {
            String token = tokenizer.nextToken();
            String[] keyValue = token.split("="); --> This line creates "Y,"
            if (keyValue.length == 2) {
                String key = keyValue[0];
                String value = keyValue[1]; 

                // Store the parts in the HashMap
                cKeyValueMap.put(key, value);
            }
        } // End of While

当代码结束时,我在 cKeyValueMap 中有以下数据 -

"INFILEDFT" -> "Y,"
"WEDHLPDFT" -> "Y,"
"ELVUNTDFT" -> "Y,"
"SHWMATDFT" -> "Y,"
"USEWEDDFT" -> "Y,"
"ZIPPATH" -> "C:\7Zip.exe,"
"XPPATH" -> "C:\Users\User\DeskTop\X-Plane\X-Plane"
"WEDPATH" -> "C:\WED.exe,"
"{RUNWEDDFT" -> "Y,"
"XPTPATH" -> "XPTOOLS"
"NEWDSFDFT" -> "Y}"

这是正确的吗?我是否必须忽略无关的字符,或者我做错了什么。

我尝试过修改用于传递数据的数组类型,但我总是需要回到 kv 对。

如果没有一些严重的“摆弄”,我无法获得“N”或“Y”值来代替 getActionCommand。

java hashmap
1个回答
0
投票

默认情况下 StringTokenizer 使用空格作为分隔符来分隔字符串中的标记。使用 StringTokenizer 构造函数,它允许您使用所需的分隔符,例如:

StringTokenizer tokenizer = new StringTokenizer(myString, ", ");

现在尝试你的

while
循环。

也许使用 java.util.Scanner 类而不是 StringTokenizer:

String strg = "{RUNWEDDFT=Y, INFILEDFT=Y, WEDHLPDFT=Y, ELVUNTDFT=Y, SHWMATDFT=Y, "
            + "USEWEDDFT=Y, ZIPPATH=C:\\7Zip.exe, "
            + "XPPATH=C:\\Users\\User\\DeskTop\\X-Plane\\X-Plane Custom Scenery Path, "
            + "WEDPATH=C:\\WED.exe, XPTPATH=XPTOOLS App Path, NEWDSFDFT=Y}";
if (strg.startsWith("{") && strg.endsWith("}")) {
    strg = strg.substring(1, strg.length());
}
    
java.util.Scanner tokenizer = new java.util.Scanner(strg).useDelimiter(",\\s*");
    
while (tokenizer.hasNext()) {
    String token = tokenizer.next();
    String[] keyValue = token.split("=");
    if (keyValue.length == 2) {
        String key = keyValue[0];
        String value = keyValue[1]; 

        System.out.println("Key = " + key + "  |  Value = " + value);
            
        // Store the parts in the HashMap
        //cKeyValueMap.put(key, value);
    }
}
tokenizer.close();

传递给

",\\s*)
的参数
.useDelimiter()
是一个 正则表达式,其基本含义是: 使用逗号 (,) 以及逗号后没有或可能有更多空格作为分隔符。

© www.soinside.com 2019 - 2024. All rights reserved.