Чтение ввода как массива - PullRequest
0 голосов
/ 22 октября 2010

Я хочу, чтобы что-то считывалось из inputtream для хранения в int [], когда я набираю «read 1 2 3 4».что я должен делать?

Я не знаю размера массива, все динамично ...

Вот текущий код:

BufferedReader stdin = new BufferedReader(
new InputStreamReader(System.in));
String line = stdin.readLine();
StringTokenizer st = new StringTokenizer(line);
String command = st.nextToken();

if (command.equals("read")) {
   while (st.nextToken() != null) {
       //my problem is no sure the array size
   }
}

Ответы [ 3 ]

1 голос
/ 22 октября 2010

Вам нужно что-то построить для разбора входного потока.Предполагая, что это буквально так сложно, как вы указали, первое, что вам нужно сделать, это вывести строку из InputStream, вы можете сделать это так:

// InputStream in = ...;

// read and accrue characters until the linebreak
StringBuilder sb = new StringBuilder();
int c;
while((c = in.read()) != -1 && c != '\n'){
    sb.append(c);
}

String line = sb.toString();

Или вы можете использовать BufferedReader (как указано в комментариях):

BufferedReader rdr = new BufferedReader(new InputStreamReader(in));
String line = rdr.readLine();

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

// now process the whole input
String[] parts = line.split("\\s");

// only if the direction is to read the input
if("read".equals(parts[0])){
    // create an array to hold the ints
    // note that we dynamically size the array based on the
    // the length of `parts`, which contains an array of the form
    // ["read", "1", "2", "3", ...], so it has size 1 more than required
    // to hold the integers, thus, we create a new array of
    // same size as `parts`, less 1.
    int[] inputInts = new int[parts.length-1];

    // iterate through the string pieces we have
    for(int i = 1; i < parts.length; i++){
         // and convert them to integers.
        inputInts[i-1] = Integer.parseInt(parts[i]);
    }
}

Я уверен, что некоторые из этих методов могут генерировать исключения (по крайней мере, read и parseInt do), я оставлю обработку их как упражнение.

0 голосов
/ 22 октября 2010

Извлеките данные и ключевое слово из вашей строки, затем вставьте их примерно так:

public static Integer[] StringToIntVec( String aValue )
{

    ArrayList<Integer> aTransit = new ArrayList<Integer>();

    for ( String aString : aValue.split( "\\ ") )
    {
        aTransit.add( Integer.parseInt( aString ) );

    }

    return aTransit.toArray( new Integer[ 0 ] );

}
0 голосов
/ 22 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...