Java: соединение строки из списка <String>в обратном порядке - PullRequest
0 голосов
/ 26 января 2019

У меня есть 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

Ответы [ 6 ]

0 голосов
/ 26 января 2019

Вот одно решение с использованием Java 8:

Collections.reverse(list);

//res contains the desired string
String res = list.stream().collect(Collectors.joining(","));
0 голосов
/ 26 января 2019

Один метод использования 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());
0 голосов
/ 26 января 2019

Использование поставщика

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(","));
0 голосов
/ 26 января 2019

Если вы не хотите изменять список, вызывая для него Collections.reverse(List<?> list), повторите список в обратном порядке.

Если вы не знаете тип списка, используйтеListIterator для итерации списка в обратном направлении без потери производительности, например, обычный цикл i = 0; i < size() над LinkedList в противном случае будет работать плохо.

Чтобы объединить значения, разделенные запятыми, используйте 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
0 голосов
/ 26 января 2019

Другой способ, используя Comparator.

List<String> list = Arrays.asList("A", "B", "C");
list.sort(Comparator.reverseOrder());
String joinedString = String.join(",", list);
0 голосов
/ 26 января 2019

Самое простое - использовать Collections#reverse и String#join.

List<String> list = Arrays.asList("A", "B", "C");
Collections.reverse(list);
String joinedString = String.join(",", list);
...