是否可以在for或while循环中声明引用变量?

时间:2019-05-27 06:25:17

标签: java

我写了一个简短的代码,声明了一个名为“ ChosenCompanies”的类的6个引用变量,以使用Java练习类和构造函数。

以下内容:

public static void main(String[] args) {

    String[] FinalCompaniesName = new String[6];

    ChosenCompanies com1 = new ChosenCompanies();
    ChosenCompanies com2 = new ChosenCompanies();
    ChosenCompanies com3 = new ChosenCompanies();
    ChosenCompanies com4 = new ChosenCompanies();
    ChosenCompanies com5 = new ChosenCompanies();
    ChosenCompanies com6 = new ChosenCompanies();

    Scanner scanner = new Scanner(System.in);
    int choice;
    int count = 1;
    while(count <= 2) {
        switch(count) {
        case 1:
            System.out.println("Choose one:");
            System.out.println("1. " + com1.name);
            System.out.println("2. " + com2.name);
            System.out.println("3. " + com3.name);
            choice = scanner.nextInt();
            switch(choice) {
            case 1:
                FinalCompaniesName[0] = com1.name;
                break;
            case 2:
                FinalCompaniesName[0] = com2.name;
                break;
            case 3:
                FinalCompaniesName[0] = com3.name;
                break;
            }
        break;
        case 2:
            System.out.println("Choose one:");
            System.out.println("1. " + com4.name);
            System.out.println("2. " + com5.name);
            System.out.println("3. " + com6.name);
            choice = scanner.nextInt();
            switch(choice) {
            case 1:
                FinalCompaniesName[1] = com4.name;
                break;
            case 2:
                FinalCompaniesName[1] = com5.name;
                break;
            case 3:
                FinalCompaniesName[1] = com6.name;
                break;
            }
            break;
        }    
        count++;
    }
        System.out.println("You have chosen: "
 + FinalCompaniesName[0] + ", " + FinalCompaniesName[1]);

}

从上面的代码中可以看到,除了引用变量的名称(com1,com2,com3,com4 ...)之外,这两部分几乎相同:

第1部分:

        switch(count) {
        case 1:
            System.out.println("Choose one:");
            System.out.println("1. " + com1.name);
            System.out.println("2. " + com2.name);
            System.out.println("3. " + com3.name);
            choice = scanner.nextInt();
            switch(choice) {
            case 1:
                FinalCompaniesName[0] = com1.name;
                break;
            case 2:
                FinalCompaniesName[0] = com2.name;
                break;
            case 3:
                FinalCompaniesName[0] = com3.name;
                break;
            }
         break;

第2部分:

        case 2:
            System.out.println("Choose one:");
            System.out.println("1. " + com4.name);
            System.out.println("2. " + com5.name);
            System.out.println("3. " + com6.name);
            choice = scanner.nextInt();
            switch(choice) {
            case 1:
                FinalCompaniesName[1] = com4.name;
                break;
            case 2:
                FinalCompaniesName[1] = com5.name;
                break;
            case 3:
                FinalCompaniesName[1] = com6.name;
                break;
                }
            break;
        }    

我想知道是否可以通过使用for或while循环来减少上面的代码量,因为引用变量的名称增加了1,就像常见的for语句中的整数“ i”一样。

简而言之,是否可以使用循环声明引用变量?

2 个答案:

答案 0 :(得分:1)

在Java中无法创建动态变量(但带有反射,请参见here

您可以创建一个数组并将i用作索引,例如chosenCompanies[i]

否则,您可以使用列表或地图。

编辑:

例如看起来像这样。除了代码的意义外,此示例仅显示如何使用数组:

    String[] choosenCompanieNames = new String[2]; // you only store two values, not 6 values

    //lets store the values to chose in arrays
    String[] possibleCompanieNames = new String[6]; // 6 possible values to choose (com1 - com6)
    possibleCompanieNames[0] = "com1";
    possibleCompanieNames[1] = "com2";
    possibleCompanieNames[2] = "com3";
    possibleCompanieNames[3] = "com4";
    possibleCompanieNames[4] = "com5";
    possibleCompanieNames[5] = "com6";

    //I deleted the while loop, as it only has two ways and every way has its own code. 

    Scanner scanner = new Scanner(System.in);
    int choice;

    System.out.println("Choose one:");
    System.out.println("1. " + possibleCompanieNames[0]);
    System.out.println("2. " + possibleCompanieNames[1]);
    System.out.println("3. " + possibleCompanieNames[2]);
    choice = scanner.nextInt();
    choosenCompanieNames[0] = possibleCompanieNames[choice-1]; //you must subtract one, as the array index starts at 0 and ends on 5

    System.out.println("Choose one:");
    System.out.println("1. " + possibleCompanieNames[3]);
    System.out.println("2. " + possibleCompanieNames[4]);
    System.out.println("3. " + possibleCompanieNames[5]);
    choice = scanner.nextInt();
    choosenCompanieNames[1] = possibleCompanieNames[3+choice-1]; //here you want com4, com5 and com6, so you can e.g. add 3 to index and substract one like code above. Or better add only 2, as 3-1=2


    System.out.println("You have chosen: "
         + choosenCompanieNames[0] + ", " + choosenCompanieNames[1]);

答案 1 :(得分:1)

您的示例令人困惑,所以我不知道您到底要完成什么,但这是一个示例,该示例如何提示用户从现有公司名称列表中为每个公司选择一个新名称:

    public class Company {

    /**
     * Array of available company names used to construct
     * initial companies. These names are also used as possible
     * choices when changing company names through {@link #changeCompanyNames()}
     */
    private static final String[] COMPANY_NAMES = new String[]
            { "Alphabet", "Microsoft", "IBM", "Amazon", "Oracle", "Apple" };

    /**
     * <p>
     * Array of Company objects initialized with a fixed number of
     * new companies equal to the number of String entries in {@link #COMPANY_NAMES}.
     * </p><p>
     * Each company entry will inheriting a name from the mentioned array
     * in the initialization process done in {@link #initializeCompanies()}
     * </p>
     */
    public static final Company[] COMPANIES = initializeCompanies();

    private String name;

    /**
     * Internal constructor with private access to
     * prevent class construction outside this class
     */
    private Company(String name) {
        this.name = name;
    }

    /**
     * Should only be used internally on class loading to
     * construct an array of companies from a list of company names.
     */
    private static Company[] initializeCompanies() {

        Company[] companies = new Company[COMPANY_NAMES.length];
        for (int i = 0; i < COMPANY_NAMES.length; i++) {
            companies[i] = new Company(COMPANY_NAMES[i]);
        }
        return companies;
    }

    /**
     * Change any or all company names by prompting the user to choose
     * a new name for each company from the list of available companies.
     */
    public static void changeCompanyNames() {

        java.util.Scanner scanner = new java.util.Scanner(System.in);
        /*
         * Create a new array of company names that is identical to the existing
         * array of company names. We will change names here on user input and
         * then update each new company name to values from this array.
         */
        final String[] finalCompanyNames = COMPANY_NAMES.clone();
        /*
         * Iterate through an array of companies with a for-loop
         * accessing and processing each company entry
         */
        for (int i1 = 0; i1 < COMPANIES.length; i1++)
        {
            /* Prompt the user to choose a new company name for the
             * company at index i1 from COMPANIES array.
             */
            System.out.printf("Choose a new company name for %s company:%n", COMPANIES[i1].name);
            /*
             * Again iterate through all companies and print their names to
             * console offering the user a list of possible names to choose from
             */
            for (int i2 = 0; i2 < COMPANIES.length; i2++) {
                System.out.printf("%d. %s%n", i2 + 1, COMPANIES[i2].name);
            }
            /*
             * Get user input and validate it, then either update the array of
             * final names with the new entry or print an error and move the index
             * to the previous position if the input was an invalid number
             */
            int input = scanner.nextInt();
            if (input > 0 && input <= COMPANIES.length) {
                finalCompanyNames[i1] = COMPANY_NAMES[input - 1];
                System.out.println("You have choosen company name " + finalCompanyNames[i1]);
            }
            else {
                System.out.printf("Error: input is not in range (1-%d)%n", COMPANIES.length);
                /*
                 * It's imperative that we move the index to the previous
                 * position so we can iterate over this company entry again
                 */
                i1 -= 1;
            }
        }
        // Print simple line separator
        System.out.println("");

        /* Print each choosen name that is different then the original
         * company name and update the appropriate company name field value
         */
        for (int i = 0; i < finalCompanyNames.length; i++)
        {
            if (!finalCompanyNames[i].equals(COMPANY_NAMES[i])) {
                System.out.printf("Company %s has changed name to %s%n", COMPANY_NAMES[i], finalCompanyNames[i]);
                COMPANIES[i].name = finalCompanyNames[i];
            }
        }
    }
}

用户完成选择后的控制台输出示例:

Company Alphabet has changed name to IBM
Company Microsoft has changed name to Amazon
Company IBM has changed name to Alphabet
Company Amazon has changed name to Oracle
Company Oracle has changed name to Microsoft
Company Apple has changed name to Amazon

在这里,我们可以设置任何数量的公司,并让用户为他们选择任何提供的名称。对于初学者来说,这些代码可能有些令人生畏,但这实际上是最简单的方法,而不会涉及任何更复杂的Java概念。

请随时询问有关此实现的任何问题。我很乐意提供帮助。

编辑:代码已更新,以包含详细的注释和更全面的结构,从而更易于理解和解决索引问题。