Ошибка индекса вне границ для инициализированного массива - PullRequest
0 голосов
/ 23 мая 2019

Я перепробовал все объявления массива. Я пробовал Array<Int> и IntArray(). Я инициализировал массив и сохранил в нем значения ascii. Я могу получить к нему доступ в первом цикле. Но если я попытаюсь получить к нему доступ после этого, он выходит за пределы ошибки. Если я использую array.first(), это говорит о том, что массив пуст. Я могу перебрать массив, но не могу получить к нему доступ. Я не знаю, в чем ошибка. Я новичок в Котлине.

import java.util.*;
import java.lang.*;
import java.io.*;
fun main(args:Array<String>){
    var read=Scanner(System.`in`);
    var t=read.nextInt();
    while(t>=0){
        if(read.hasNextLine()){
            var s=read.nextLine();
            var e=0;
            var a=IntArray(s.length);
            for(i in s){
                a[e]=i.toInt();
                e++;
            }
            Arrays.sort(a);
            e=0;
            if(97==a[e]) System.out.println("-1");
            else{
                for(i in a) System.out.print(i.toChar());
                System.out.println("");
            }
        }
        t--;
    }
}

1 Ответ

0 голосов
/ 23 мая 2019

Ваша проблема не в самом массиве, а, вероятно, в том, что вы ожидали от вызовов Scanner. (Обратите внимание, что Scanner - это AutoClosable, поэтому вы можете использовать use, например, Scanner(System.in).use { /* your code here */ }.)

Прежде всего, вы используете Scanner.nextInt(). Это означает, что если вы не введете номер первым, вы получите InputMismatchException. Так что число обязательно. Если вы вводите только номер, например, 1 вы получите ваш ArrayIndexOutOfBoundsException. Причина этого заключается в следующем: сканер в основном читает 1\n, если вы нажимаете ввод после номера. Теперь nextInt() извлекает номер, а \n остается. Scanner.hasNextLine(), следовательно, true, потому что у него все еще есть конец строки. Scanner.nextLine() затем читает ваш ввод до первой новой строки, которая теперь в основном является пустой строкой.

Так что, может быть, вы уже хотите использовать первую новую строку после nextInt(), т.е. вызывать read.nextLine() сразу после nextInt(), в основном отбрасывая все, что следует за вашим номером.

Из-за вашего комментария относительно того, что вы на самом деле хотите, а именно: «Я просто хочу знать, как воспринимать входные данные как массив», теперь я скорее сконцентрируюсь на этом.

Вы можете позвонить toCharArray() на любой String. При этом ниже приведен упрощенный вариант кода, который читает String из консоли и сортирует его по целочисленному представлению:

readLine()!! // yes... we know that we enter something valuable here ;-)
       .toCharArray()
       .sortedBy(Char::toInt) // well... actually .sorted() should suffice as well
       .joinToString("")

Вот и все. Это все, что вам нужно, чтобы получить массив символов из String и отсортировать их по целочисленному представлению. Поскольку sortedBy возвращает List, вам необходимо присоединиться к нему соответственно.

Есть и другие варианты выполнения того, что вы хотите, но я думаю, что это самый простой.

Если вы все еще хотите запросить номер заранее, вы все равно можете сделать это:

print("How often? ")
val howOften = readLine()!!.toInt()
(1..howOften).forEach {
  print("${it + 1}. input: ")
  readLine()!!.toCharArray()
              .sorted()
              .joinToString("")
              .run(::println)
}

То же самое при использовании сканера будет выглядеть следующим образом:

Scanner(System.`in`).use { scanner ->
  print("How often? ")
  val howOften =scanner.nextInt()
  scanner.nextLine()
  (1..howOften).forEach {
    print("${it + 1}. input: ")
    scanner.nextLine().toCharArray()
                      .sorted()
                      .joinToString("")
                      .run(::println)
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...