我是 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。
默认情况下 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()
是一个 正则表达式,其基本含义是:
使用逗号 (,) 以及逗号后没有或可能有更多空格作为分隔符。