Получить каждый символ из каждой строки по столбцу - PullRequest
0 голосов
/ 22 декабря 2018

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

Например:

У меня есть три строки из ArrayList of Strings:

  1. chi
  2. llo
  3. ut

То, что я хочу, должно происходить примерно так, после получения каждого символа по столбцу из строк:

  1. clu
  2. hlt
  3. io

До тех пор, пока мой текущий исходный код получает только первые символы первых двух строк, то есть ' cl ', вот мой текущий исходный код:

List<String> New_Strings = new ArrayList<String>();
int Column_Place = 0;
for (String temp_str : Strings) {
    try{ //For StringIndexOutOfBoundsException (handle last String)
        if(Column_Place >= temp_str.length()){
            Current_Character = temp_str.charAt(Column_Place);
            New_Strings.add(Character.toString(Current_Character));
            break;
        }else if (Column_Place < temp_str.length()){
            Current_Character = temp_str.charAt(Column_Place);
            New_Strings.add(Character.toString(Current_Character));
        }
    }catch(Exception e){
        continue;
    }
    Column_Place++;
}

Ответы [ 4 ]

0 голосов
/ 22 декабря 2018

просто представьте список как двумерный массив.разделить каждый элемент из списка, получить j-й символ из каждого элемента, если и только если длина элемента больше, чем индекс j.

    ArrayList<String> list = new ArrayList<String>();
    list.add("chi");
    list.add("llo");
    list.add("ut");


    int size = list.size();
    int i=0, j=0,k=0;
    while(size-- > 0){
        for(i=0; i<list.size(); i++){
            String temp = list.get(i);
            if(j < temp.length()){
                System.out.print(temp.charAt(j));
            }
        }
        j++;
        System.out.println();
    }
0 голосов
/ 22 декабря 2018

Просто позвоните groupByColumn (Arrays.asList ("chi", "llo", "ut") :

public static List<String> groupByColumn(List<String> words) {
    if (words == null || words.isEmpty()) {
        return Collections.emptyList();
    }

    return IntStream.range(0, longestWordLength(words))
            .mapToObj(ind -> extractColumn(words, ind))
            .collect(toList());

}

public static String extractColumn(List<String> words, int columnInd) {
    return words.stream()
            .filter(word -> word.length() > columnInd)
            .map(word -> String.valueOf(word.charAt(columnInd)))
            .collect(Collectors.joining(""));
}

public static int longestWordLength(List<String> words) {
    String longestWord = Collections.max(words, Comparator.comparing(String::length));
    return longestWord.length();
}
0 голосов
/ 22 декабря 2018

Вы добавляете строковые представления отдельных символов в результирующую строку.Вместо этого вы должны накапливать эти символы в результирующей строке.Например:

int numStrings = strings.size();
List<String> result = new ArrayList<>(numStrings);
for (int i = 0; i < numStrings; ++i) {
    StringBuilder sb = new StringBuilder();
    for (String s : strings) {
        if (i < s.length) {
            sb.append(s.charAt(i));
        }
    }
    result.add(sb.toString());
}
0 голосов
/ 22 декабря 2018

Вы просматриваете список с помощью расширенного цикла / foreach.Таким образом, вы будете повторять один раз для каждой строки.В то время как ваш результат: передаются только первые буквы.
Вы должны использовать цикл while с условием while while(Column_Place < Strings.size()) при таком подходе.
Или, в качестве альтернативы, вы можете сделать что-то за два отдельных шага.и использовать функции Java 8.

Обратите внимание, что в Java переменные начинаются со строчной буквы.Пожалуйста, следуйте соглашениям, чтобы сделать ваш код более читаемым / понятным здесь и там.

В Java 8 вы можете сделать:

List<String> strings = new ArrayList<>(Arrays.asList("chi", "llo", "ut"));

int maxColumn = strings.stream()
                 .mapToInt(String::length)
                 .max()
                 .getAsInt(); // suppose that you have at least one element in the List


List<String> values =
        // stream from 0 the max number of column
        IntStream.range(0, maxColumn) 
                 // for each column index : create the string by joining their 
                 // String value or "" if index out of bound
                 .mapToObj(i -> strings.stream() 
                                       .map(s -> i < s.length() ? String.valueOf(
                                               s.charAt(i)) : "")
                                       .collect(Collectors.joining()))
                 .collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...