按空格分隔列表项,按标签分隔上级指标

时间:2018-06-29 20:38:14

标签: java arrays list whitespace apache-stringutils

我具有以下功能:

 public String tabSerializer(String log, String time) {
        StringJoiner joiner = new StringJoiner("\t");
        addValue(company, joiner);
        addValue(users, joiner);
        ...
        return joiner.toString();
     }


  private static void addValue(Object value, StringJoiner joiner){
        if(value instanceof List){
            addValuesFromList((List<?>)value, joiner);
        }
        else{
            joiner.add(String.valueOf(value));
        }
    }
  private static void addValuesFromList(List<?> arr, StringJoiner joiner) {
        for(int i=0; i<arr.size(); i++){
            Object value = arr.get(i);
            addValue(value, joiner);
        }
    }

company是字符串列表。例子:[苹果,芒果]。我试图通过选项卡分隔在tabSerializer()函数中传递的所有值。但是,使用我当前的代码,即使在列表值(例如,苹果芒果)之间也获得了制表符,而不是空格。

我想用空格分隔列表值,同时仍用制表符分隔所有更高级别的尺寸。

我尝试添加:value= value + " " in the "addValuesFromList()"函数,但不知道如何进一步使用该函数与木匠集成。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

或者,如果您仍然想使用StringJoiner,请在addValuesFromList中使用第二个连接器。

private static void addValuesFromList(List<?> arr, StringJoiner joiner) {
    StringJoiner spaceJoiner = new StringJoiner(" ");

    for (int i = 0; i < arr.size(); i++) {
        Object value = arr.get(i);
        spaceJoiner.add(String.valueOf(value));
    }
    String spacedValue = spaceJoiner.toString(); 
    addValue(spacedValue, joiner);

}

它将满足您的需求吗?

答案 1 :(得分:0)

StringJoiner是一个很好的 helper 类,用于:

  

...构造由定界符分隔的字符序列...

由于您需要多个定界符,因此StringJoiner并不是最佳的工具。

相反,您可以自己使用StringBuilder

public String tabSerializer(Object... values) {
    StringBuilder buf = new StringBuilder();
    boolean first = true;
    for (Object value : values) {
        if (first)
            first = false;
        else
            buf.append('\t');
        appendValue(buf, value);
    }
    return buf.toString();
}

private static void appendValue(StringBuilder buf, Object value) {
    if (value instanceof List) {
        appendListValues(buf, (List<?>) value);
    } else {
        buf.append(value);
    }
}

private static void appendListValues(StringBuilder buf, List<?> list) {
    boolean first = true;
    for (Object value : list) {
        if (first)
            first = false;
        else
            buf.append(' ');
        buf.append(value);
    }
}

测试

System.out.println(tabSerializer("Foo", Arrays.asList("A", "B"), "Bar"));

输出(使用→箭头显示的选项卡)

Foo→A B→Bar