首页 > 解决方案 > 设置数组大小并将字符串用户输入解析为数组

问题描述

我需要将数组的大小设置为等于 numberResponses 以便无论用户输入多少数字,无论他们列出多少部电影,数组都将是该大小。我知道我可以用 String[] favMoviesArray = new String(numberResponses); 声明数组 但是我不确定如何将用户的响应拆分为数组的不同索引。

import java.util.Scanner;
import java.util.Arrays;

public class Assignment3 {

    public static void main(String[] args) {
        Scanner userInput = new Scanner(System.in);

        System.out.println("Your favorite movies:");
        System.out.println("How many favorite movies do you have?");

        String numberResponsesStr = userInput.nextLine();
        int numberResponses;
            try{
                numberResponses = Integer.parseInt(numberResponsesStr);
            }
            catch(Exception e){
                System.out.println("Invalid input. Please enter a number.");
                return;
            }

        if(numberResponses < 1){
            System.out.println("Invalid input. Please enter a positive number.");
            return;
        }

        System.out.printf("List your %d favorite movies. Separate them with commas (Movie1, Movie2, Movie3, etc.).", numberResponses);      
        String favMovies = userInput.nextLine();
        System.out.println();        
        String[] favMoviesArray = favMovies.split("\\s*,\\s*");     
        Arrays.sort(favMoviesArray);

        System.out.printf("Your %d favorite movies are: %n", numberResponses);
        System.out.println(Arrays.toString(favMoviesArray));

        userInput.close();      
    }

}```

标签: javaarrayssplitjava.util.scanner

解决方案


你所想的会奏效。您可以将初始数组声明为用户指定的长度。然后你需要从拆分数组中转移到它,不要超过它可以容纳的元素,并且不要超过从拆分中出来的元素。Math.min做得很好,我做了一个循环来复制。如果用户指定更多,则仅使用适合的那些;我选择了第一个输入的,但如果您更喜欢按字母顺序输入第一个,那会更容易,也更容易排序。如果小于,则用 ZZZ 条目填充数组(排序到末尾)。结果如下:

import java.util.Scanner;
import java.util.Arrays;

public class Assignment3 {
public static void main(String[] args) {
    Scanner userInput = new Scanner(System.in);

    System.out.println("Your favorite movies:");
    System.out.println("How many favorite movies do you have?");

    String numberResponsesStr = userInput.nextLine();
    int numberResponses;
    try {
        numberResponses = Integer.parseInt(numberResponsesStr);
    } catch (Exception e) {
        System.out.println("Invalid input. Please enter a number.");
        return;
    }

    if (numberResponses < 1) {
        System.out.println("Invalid input. Please enter a positive number.");
        return;
    }

    String[] theUltimateArray = new String[numberResponses]; //just like you thought
    for (int i = 0; i < numberResponses; i++) {
        theUltimateArray[i] = "ZZZ"; //start ZZZ, not null, to avoid ugliness and bad sorts, and so these are at the end with this sentinel value
    }

    System.out.printf("List your %d favorite movies. Separate them with commas (Movie1, Movie2, Movie3, etc.).", numberResponses);
    String favMovies = userInput.nextLine();
    System.out.println();
    String[] favMoviesArray = favMovies.split("\\s*,\\s*");
    //Arrays.sort(favMoviesArray); don't sort yet, want the first ones entered, not first alphabetically

    System.out.printf("Your %d favorite movies are: %n", numberResponses);
    //System.out.println(Arrays.toString(favMoviesArray));

    int n = Math.min(numberResponses, favMoviesArray.length); //number we can copy
    for (int i = 0; i < n; i++) { //copy
        theUltimateArray[i] = favMoviesArray[i];
    }
    Arrays.sort(theUltimateArray);
    System.out.println(Arrays.toString(theUltimateArray)); //never larger than they said. Filled at end

    userInput.close();
}

}

推荐阅读