Отдельные элементы списка по пробелам и метрики более высокого уровня по вкладкам - PullRequest
0 голосов
/ 29 июня 2018

У меня есть следующие функции:

 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);
        }
    }

Компания представляет собой список строк. Пример: [яблоко, манго]. Я пытаюсь отделить все значения, переданные в функции tabSerializer (), с помощью вкладки. Однако, используя мой текущий код, я получаю вкладки даже между значениями списка (например, яблочный манго) вместо пробелов.

Я хочу разделить значения списка пробельными символами, но все еще разделить все значения более высокого уровня по вкладкам.

Я пытался добавить: value= value + " " in the "addValuesFromList()" функцию, но не знаю, как использовать ее для интеграции с столяром.

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Или, если вы все еще хотите использовать 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);

}

будет ли это делать то, что вам нужно?

0 голосов
/ 30 июня 2018

StringJoiner хороший помощник класс для:

... создать последовательность символов, разделенных разделителем ...

Поскольку вам нужно несколько разделителей, 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);
    }
}

Test

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

Вывод (вкладка визуализируется с помощью → стрелки)

Foo→A B→Bar
...