попытка напечатать транспонированную строку[]

#java #file #arraylist

#java #файл #список массивов

Вопрос:

Итак, я пытался взять текстовый файл, в котором есть такие входные данные, например —

 abcddhdj
efghdd
ijkl
  

чтобы получить это —

 j
d
hd
dd
dhl
cgk
bfj
aei
  

я пытался сделать это с помощью массива 2d-символов, который выдавал ошибку nullexception и arrayoutofbound и в основном не работал, затем попробовал string array , arraylist из arraylist из char , и, наконец, я пытался использовать arraylsit из string

вот самое близкое, что я получил от своего решения после долгих поисков с помощью string[] —

 public static void main(String[] args) throws IOException
{
    BufferedReader br = new BufferedReader(new FileReader("C:\test.txt"));         // PUT YOUR FILE LOCATION HERE
    int k=0,i,j=0,x;
    String line[] = new String[10] ;     //SET THE APPROXIMATE NUMBER OF ROWS
    while((line[k] = br.readLine()) !=null)
        {System.out.println(line[k]);      //print to check input - verified
         k  ;


        }
    for(x=0;x<k;x  )
    {if(j<line[x].length())
       {j=line[x].length()-1;}    //this part not working in above loop
    }
    System.out.println(j);    // verified but not working inside previous loop for some reason
    System.out.println(k);


    for(x=j-1;x>=0;x  )         //without this loop,its perfect, but with it gives  indexoutofbound error , doesnt run at x=j
    {  for(i=0;i<k;i  )
       { System.out.print(line[i].charAt(x));
       } 
       System.out.println();
    }

}
  

вот один вывод

 run:
abcd
efgh
ijkl
4     //should have come as 3 since i did length-1
3
chl     //notice the d missing , every char of first row shifted,just why
bgk    //in outofbound error , it only prints d at the end, need explanation 
afj
ei
BUILD SUCCESSFUL (total time: 0 seconds)
  

если я добавлю пробел после abcd, это приведет к indexoutofbound и отсутствию вывода после k
в конце я использовал другой метод, который добавляет пробелы, чтобы сделать всю длину равной
и все же вывод был неправильным, плюс что-то не так с этим способом мышления, должен быть лучший метод

итак, я попробовал arraylist , это снова доставляет мне больше проблем

пытаюсь решить это любым понятным методом.

Ответ №1:

Это должно сработать:

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

 public static void main(String[] args)
{
    try (BufferedReader br = new BufferedReader(new FileReader("C:\test.txt")))
    {
        String line;
        List<List<Character>> lines = new ArrayList<>();

        int longestLine = 0;
        while((line = br.readLine()) !=null)
        {
            line = line.trim();

            if (line.length() > 0)
            {
                List<Character> currList = new ArrayList<>();
                for (char c : line.toCharArray())
                {
                    currList.add(c);
                }

                if (currList.size() > longestLine)
                {
                    longestLine = currList.size();
                }

                lines.add(currList);
            }
        }

        // pad all lists to be the same as the longest
        for (List<Character> currList : lines)
        {
            while (currList.size() < longestLine)
            {
                currList.add(Character.MIN_VALUE);
            }
        }

        // go through each list backwards
        for (int i = longestLine - 1; i >= 0; i-- )
        {
            for (List<Character> currList : lines)
            {
                System.out.print(currList.get(i));
            }
            System.out.println();
        }
    }
    catch (Throwable t)
    {
        t.printStackTrace();
    }
}
  

Пример ввода:

 abcd
efgh
ijkl
g
  

Пример вывода:

 dhl
cgk
bfj
aeig
  

Комментарии:

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

2. для ввода — abcd efgh ijkl g вывод — g d chl bgj afj ei

3. @RAK Для ввода: abcd efgh ijkl g Вывод должен быть: dhl cgk bfj aeig

4. да, но это не то, что указано в комментарии, который я дал выше

5. @RAK не уверен, почему вы получаете этот вывод. Я обновлю свой пост, чтобы уточнить ввод / вывод

Ответ №2:

Предполагая, что входные данные считываются в arraylist

 ArrayList<String> inputList = new ArrayList<String>();
inputList.add("abcddhdj");
inputList.add("efghdd");
inputList.add("ijkl");

int maxSize = 0;
for (String input : inputList) {
    if (input.length() > maxSize) {
        maxSize = input.length();
    }
}
String outputList[] = new String[maxSize];
for (int i = 0; i < maxSize; i  ) {
    String output = "";
    for (String input : inputList) {
      if(i<input.length())
          output=output input.charAt(i);
    }
    outputList[maxSize-(i 1)]=output;
}
  

Ответ №3:

Сохраните все в прямой 2d массив и транспонируйте в цикле печати

     final char[][] matrix = Files.lines(Paths.get(fileName)).map(String::toCharArray).toArray(char[][]::new);
    final int width = Arrays.stream(matrix).mapToInt(a -> a.length).max().getAsInt();

    for (int i = 0; i < width;   i ) {
        final int idx = width-i-1;
        String s = Arrays.stream(matrix).map(a -> a.length > idx ? String.valueOf(a[idx]) : " ").collect(Collectors.joining());
        System.out.println(s);
    }
  

Комментарии:

1. я попытался изменить имя файла в первой строке с test.txt или C:\test.txt но это не сработало, пожалуйста, скажите, как поместить имя файла

2. ммм, я уже сказал, что это не работает, это выдает — ошибка: не удается найти символ и ошибка: неверная ссылка на метод

3. это означает пропущенный импорт. добавьте «импортировать java.nio.file.*».