格式化LinkedHashMap

时间:2018-12-05 13:52:00

标签: java linked-list string-formatting linkedhashmap

我试图重新格式化LinkedHashMap的输出以排除逗号和花括号。

这是我的看跌期权:

token.put("[Server.Protocol]", url.getProtocol() + "\n");
token.put("[Server.hostName]", url.getHost() + "\n");
token.put("[Server.Port]", url.getPort() + "\n");
values.add(token.toString());

令牌是我的LinkedHashMap,值是我的LinkedList。

这是我的输出:

{[Server.Protocol]=https
, [Server.Name]=myserver
, [Server.Port.HTTPS]=123
}

这就是我想要的:

[Server.Protocol]=https
[Server.hostName]=myserver
[Server.Port]=123

这是我的打印方法:

private void webconfigToINI() throws IOException {
    File fout = new File(propFile);

    try {
        FileOutputStream fos = new FileOutputStream(fout, true /* append */);

        writer = new PrintWriter(fos);
        if (fos.getChannel().size() == 0)
            writer.print("[Code]\n");
        for (String value : values) {
            //writer.print(value.substring(1, value.length()-1));
            writer.print(value);
        }
        // writer.print("[Code]\n");
        writer.flush();
        writer.close();
        fos.close();
    } catch (Exception e) {
        throw e;
    }
}

4 个答案:

答案 0 :(得分:3)

这里:

values.add(token.toString());

您正在调用地图对象上的toString()。它将调用在AbstractMap基类中实现的toString()。该方法将迭代条目,并在其条目周围添加{}大括号。

因此,简单的答案:不要调用该方法!

相反,您可以手动迭代地图对象的entrySet(),拉出键,值,然后将其写入文件中。

除此之外:您首先需要该地图吗?如果token仅用于调用toString()来获取这些字符串...则使用StringBuilder会更有效。只需将您的字符串推入该生成器中,然后最后使用它即可。

答案 1 :(得分:2)

您可以使用以下方法来代替在地图上调用toString

String string = token.entrySet()
                      .stream()
                      .map(e -> e.getKey() + "=" + e.getValue())
                      .collect(Collectors.joining());

如果不能使用Java 8,则必须使用entrySet()进行迭代并加入数据以从地图中检索它们,如下所示:

String string = "";
for (Map.Entry<String, String> value: token.entrySet()) {
    string = string + value.getKey() + "="+value.getValue();
}

答案 2 :(得分:0)

我的单行代码(前后有足够的代码来构成一个完整的示例):

    LinkedHashMap<String, String> token = new LinkedHashMap<>();
    token.put("[Server.Protocol]", "https");
    token.put("[Server.hostName]", "myserver");
    token.put("[Server.Port]", "123");
    String value = token.entrySet().stream().map(Map.Entry::toString).collect(Collectors.joining("\n"));
    System.out.println(value);

输出:

[Server.Protocol]=https
[Server.hostName]=myserver
[Server.Port]=123

答案 3 :(得分:0)

您好,如果您使用的是Java 8或更高版本,则可以尝试以下方法:

 LinkedHashMap<String, String> token = new LinkedHashMap<>();
        token.put("[Server.Protocol]", "https" + "\n");
        token.put("[Server.hostName]", "myserver" + "\n");
        token.put("[Server.Port]", "8080" + "\n");


        String val = token.entrySet().stream().map(k -> k.getKey()+ "="+ 
    k.getValue()).collect(joining(""));
        System.out.println(val);

打印的值将看起来像您所期望的 欢呼