【问题标题】:Format text with a list of argument in java [closed]在java中使用参数列表格式化文本[关闭]
【发布时间】:2020-09-09 08:57:39
【问题描述】:

我有多个 %s 用于字符串格式化。我有一个字符串数组,它们应该是字符串格式化的参数。像这样

List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
String toFormat =  "This is a first value %s, This is a second value %s"
String result = String.formant (toFormat, list.get(0), list.get(1));

但如果元素数量大于 2,它看起来不太好。如何在不单独从列表中选择每个参数的情况下格式化字符串?

【问题讨论】:

  • @JGFMK 这是一个非常糟糕的例子,与将列表传递给给定的format 无关。
  • @Amongalen 您描述的方法不灵活。而该链接显示了正在打印的任何尺寸的列表,其中包含几种卓越的解决方案
  • 这取决于您如何解释 OPs 问题。据我了解,他已经有一些格式字符串,其中包含 20 个“%s”,并且希望将参数列表传递给 String.format 而无需使用 list.get(x) 20 次。

标签: java string.format


【解决方案1】:

String.format() 将对象的格式和数组作为参数(vararg 是幕后的对象数组)。您需要做的就是将您的列表转换为字符串数组并将其传递给String.format(),如下所示:

public static void main(String args[]) {
    List<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    String toFormat =  "This is a first value %s, This is a second value %s";
    String result = String.format (toFormat, list.toArray(new String[0]));
    System.out.println(result);
}

【讨论】:

  • 效果很好。我确实意识到参数是一个对象,但不知道如何准确传递字符串列表。
【解决方案2】:

重新思考你的问题:

String toFormat =  "This is a first value %s, This is a second value %s"

所以重点是:你有多个参数,但 每个 参数应该被特殊对待。含义:假设您有 3 个参数。那么您的格式必须包含this is the third value。当你有 4 个参数时,string fourth ... 必须来自某个地方!

如果这是你想要的,那么你需要一个额外的映射,比如:

Map<Integer, String> namedPositionByIndex = ...

映射成对,如(1, "first")(2, "second") 等。

并且使用 that 映射,您现在可以将一个动态工作的字符串组合在一起。当然,它只适用于地图中最大的索引。

【讨论】:

    【解决方案3】:

    你可以使用String Builder并使用它来动态构建一个大字符串吗?

    使用 Java8 或更高版本,您可以执行以下操作

    import java.util.List;
    import java.util.ArrayList;
    import java.lang.StringBuilder;
    
    class Main {
      public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        StringBuilder builder = new StringBuilder();
        list.forEach(it -> {
            builder.append(String.format("This is a first value %s,", it)
          }
        ));
        System.out.print(builder.toString());
      }
    }
    

    结果如下:This is a first value A,This is a first value B,

    您可以在forEach 中添加更多代码来修复字符串模式

    【讨论】:

    • 是的,但他不希望它说“首先……首先”。他想要“第一……第二……第三”……等等。这根本没有意义。问题不清楚...
    • 我相信 OP 给出的 toFormat 字符串只是一个例子,实际上它只是一些自定义字符串,大约有 20 个 %s
    • 我同意你的观点,我认为问题的格式不清楚,我发布此代码是因为可以自定义 for each 并插入,例如“first”的字符串和“第二”。另外,我觉得题主是X,Y题xyproblem.info
    • 如果有更多详细信息,我可以使用解决方案更新我的问题,或者如果答案与问题不匹配,则将其删除。目前,我认为是找到解决方案的好模式
    • 是的,我以字符串 toFormat 为例。实际上,我需要格式化一个巨大的 sql 请求,其中包含多个 %s 占位符作为参数
    猜你喜欢
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    相关资源
    最近更新 更多