用空格分隔列表项,用制表符分隔更高级别的指标
Separate list items by whitespace and higher level metrics by tabs
我有以下功能:
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()"
函数,但不知道如何进一步使用它来与 joiner 集成。
如有任何帮助,我们将不胜感激。
StringJoiner
是一个很好的 帮手 class 到:
... construct a sequence of characters separated by a delimiter ...
由于您需要多个定界符,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
或者,如果您仍想使用 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);
}
它能满足您的需求吗?
我有以下功能:
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()"
函数,但不知道如何进一步使用它来与 joiner 集成。
如有任何帮助,我们将不胜感激。
StringJoiner
是一个很好的 帮手 class 到:
... construct a sequence of characters separated by a delimiter ...
由于您需要多个定界符,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
或者,如果您仍想使用 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);
}
它能满足您的需求吗?