Java : 以相反的顺序从 List<String> 中加入字符串
Java : Joining String from List<String> in reverse order
我有List<String> list = Arrays.asList("A", "B", "C");
我想用分隔符 ,
以相反的顺序加入列表中的所有字符串:
//result
String joinedString = "C,B,A";
实现此目标的最佳方法是什么?
目前我使用索引循环:
String joinedString = "";
List<String> list = Arrays.asList("A", "B", "C");
for (int i = list.size() - 1; i >= 0; i--) {
String string = list.get(i);
joinedString = joinedString + string + ",";
}
//to remove ',' from the last string
if(joinedString.length() > 0) {
joinedString = joinedString.substring(0, joinedString.length() - 1);
}
//Output
C,B,A
最简单的就是使用Collections#reverse
and String#join
.
List<String> list = Arrays.asList("A", "B", "C");
Collections.reverse(list);
String joinedString = String.join(",", list);
另一种方式,使用比较器。
List<String> list = Arrays.asList("A", "B", "C");
list.sort(Comparator.reverseOrder());
String joinedString = String.join(",", list);
如果您不想通过调用 Collections.reverse(List<?> list)
来修改列表,请反向迭代列表。
如果您不知道列表类型,请使用 ListIterator
向后迭代列表而不损失性能,例如在 LinkedList
上的正常 i = 0; i < size()
循环否则会表现不佳。
要连接以逗号分隔的值,请使用 StringJoiner
(Java 8+)。
List<String> list = Arrays.asList("A", "B", "C");
StringJoiner joiner = new StringJoiner(",");
for (ListIterator<String> iter = list.listIterator(list.size()); iter.hasPrevious(); )
joiner.add(iter.previous());
String result = joiner.toString();
System.out.println(result); // print: C,B,A
使用供应商
List<String> list = Arrays.asList("A", "B", "C");
int i[] = { list.size() };
Supplier<String> supplier = () -> (i[0] > 0) ? list.get(--i[0]) : null;
String s, reverse = "";
while ((s = supplier.get()) != null) {
reverse +=","+s;
}
reverse = (reverse.length() > 0) ? reverse = reverse.substring(1): "" ;
或代替 while 循环
reverse = list.stream().map(l->supplier.get()).collect(Collectors.joining(","));
一种方法使用StringBuilder
StringBuilder sb = new StringBuilder();
List<String> strs = Arrays.asList("A", "b", "c","d");
for (int i = 0; i < strs.size(); i++) {
sb.append(strs.get(i));
if (i != strs.size() - 1) {
sb.append(",");
}
}
System.out.println(sb.reverse().toString());
这是使用 Java 8 的一种解决方案:
Collections.reverse(list);
//res contains the desired string
String res = list.stream().collect(Collectors.joining(","));
它可能是有用的类连接收集器:
public static Collector<CharSequence, ?, String> joiningReversed(CharSequence delimiter, CharSequence prefix, CharSequence suffix) {
return Collector.of(StringBuilder::new,
(sb, item) -> {
if (sb.length() != 0) {
sb.insert(0, delimiter);
}
sb.insert(0, item);
},
(a, b) -> {
throw new UnsupportedOperationException();
},
sb -> sb.insert(0, prefix).append(suffix).toString());
}
并在流中使用它:
List<String> list = Arrays.asList("A", "B", "C");
String result = list.stream()
.collect(joiningReversed(",", "", ""));
System.out.println(result);
我有List<String> list = Arrays.asList("A", "B", "C");
我想用分隔符 ,
以相反的顺序加入列表中的所有字符串:
//result
String joinedString = "C,B,A";
实现此目标的最佳方法是什么?
目前我使用索引循环:
String joinedString = "";
List<String> list = Arrays.asList("A", "B", "C");
for (int i = list.size() - 1; i >= 0; i--) {
String string = list.get(i);
joinedString = joinedString + string + ",";
}
//to remove ',' from the last string
if(joinedString.length() > 0) {
joinedString = joinedString.substring(0, joinedString.length() - 1);
}
//Output
C,B,A
最简单的就是使用Collections#reverse
and String#join
.
List<String> list = Arrays.asList("A", "B", "C");
Collections.reverse(list);
String joinedString = String.join(",", list);
另一种方式,使用比较器。
List<String> list = Arrays.asList("A", "B", "C");
list.sort(Comparator.reverseOrder());
String joinedString = String.join(",", list);
如果您不想通过调用 Collections.reverse(List<?> list)
来修改列表,请反向迭代列表。
如果您不知道列表类型,请使用 ListIterator
向后迭代列表而不损失性能,例如在 LinkedList
上的正常 i = 0; i < size()
循环否则会表现不佳。
要连接以逗号分隔的值,请使用 StringJoiner
(Java 8+)。
List<String> list = Arrays.asList("A", "B", "C");
StringJoiner joiner = new StringJoiner(",");
for (ListIterator<String> iter = list.listIterator(list.size()); iter.hasPrevious(); )
joiner.add(iter.previous());
String result = joiner.toString();
System.out.println(result); // print: C,B,A
使用供应商
List<String> list = Arrays.asList("A", "B", "C");
int i[] = { list.size() };
Supplier<String> supplier = () -> (i[0] > 0) ? list.get(--i[0]) : null;
String s, reverse = "";
while ((s = supplier.get()) != null) {
reverse +=","+s;
}
reverse = (reverse.length() > 0) ? reverse = reverse.substring(1): "" ;
或代替 while 循环
reverse = list.stream().map(l->supplier.get()).collect(Collectors.joining(","));
一种方法使用StringBuilder
StringBuilder sb = new StringBuilder();
List<String> strs = Arrays.asList("A", "b", "c","d");
for (int i = 0; i < strs.size(); i++) {
sb.append(strs.get(i));
if (i != strs.size() - 1) {
sb.append(",");
}
}
System.out.println(sb.reverse().toString());
这是使用 Java 8 的一种解决方案:
Collections.reverse(list);
//res contains the desired string
String res = list.stream().collect(Collectors.joining(","));
它可能是有用的类连接收集器:
public static Collector<CharSequence, ?, String> joiningReversed(CharSequence delimiter, CharSequence prefix, CharSequence suffix) {
return Collector.of(StringBuilder::new,
(sb, item) -> {
if (sb.length() != 0) {
sb.insert(0, delimiter);
}
sb.insert(0, item);
},
(a, b) -> {
throw new UnsupportedOperationException();
},
sb -> sb.insert(0, prefix).append(suffix).toString());
}
并在流中使用它:
List<String> list = Arrays.asList("A", "B", "C");
String result = list.stream()
.collect(joiningReversed(",", "", ""));
System.out.println(result);