一个程序,它将创建一个10x10的网格并在每个图块中分配一个随机数。然后询问您是否要:


创建一个新网格
查看当前网格
计算网格中每个数字的数量/>对行求和
对列求和
退出程序

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

public class tenxten {
    static int numberRows = 10;
    static int numberColumns = 10;
    static int [][] grid = new int [numberColumns][numberRows];

    private static int randomInt(int from, int to) {
        Random rand = new Random();
        return rand.nextInt(to - from + 1) + from;
    }

    private static void amountOfSpecificNumbers() {
        int[] numbers = new int[numberColumns * numberRows];
        for (int i = 1; i < 10; i++) {
            for (int y = 0; y < 10; y++) {
                for (int x = 0; x < 10; x++) {
                    if (grid[y][x] == i) {
                        numbers[i] += i;
                    }
                }
            }
            System.out.println(" " + numbers[i] / i + " " + i + "s" );
        }
    }

    private static void sumOfColumns() {
        int sumOfColumns[] = new int[numberColumns];
        for (int x = 0; x < numberColumns; x++) {
            for (int y = 0; y < numberRows; y++) {
                sumOfColumns[y] += grid[x][y];
            }
        }
        System.out.println(Arrays.toString(sumOfColumns));
    }

    private static void sumOfRows() {
        int sumOfRows[] = new int[numberColumns];
        for (int x = 0; x < numberColumns; x++) {
            for (int y = 0; y < numberRows; y++) {
                sumOfRows[x] += grid[x][y];
            }
        }
        System.out.println(Arrays.toString(sumOfRows));
    }

    private static void newField() {
        for (int x = 0; x < numberColumns; x++) {
            for (int y = 0; y < numberRows; y++) {
                int randomNumber = (randomInt(1, 10));
                grid[x][y] = randomNumber;
                if (randomNumber < 10) {
                    System.out.print(" " + randomNumber + " ");
                } else {
                    System.out.print(randomNumber + " ");
                }
            }
            System.out.println();
        }
    }

    private static void showField() {
        for (int x = 0; x < numberColumns; x++) {
            for (int y = 0; y < numberRows; y++) {
                if (grid[x][y] < 10) {
                    System.out.print(" " + grid[x][y] + " ");
                } else {
                    System.out.print(grid[x][y] + " ");
                }
            }
            System.out.println();
        }
    }

    private static int readInt(Scanner scanner){
        int choice = 0;
        while(choice > 6 || choice < 1) {
            System.out.println("Pleas enter number 1, 2, 3, 4, 5, or 6");
            while (!scanner.hasNextInt()) {
                System.out.println("That's not even a number");
                System.out.println("Pleas enter number 1, 2, 3, 4, 5, or 6");
                scanner.next();
            }
            choice = scanner.nextInt();
        }
        return choice;
    }

    public static void main(String[] args) {
        newField();
        while(true) {
            System.out.println("What do you want to do?");
            System.out.println("1. Get a new field");
            System.out.println("2. Show current field");
            System.out.println("3. Count the numbers in the current field");
            System.out.println("4. Sum all rows");
            System.out.println("5. Sum all columns");
            System.out.println("6. Exit program");
            Scanner scanner = new Scanner(System.in);

            int choice = readInt(scanner);

            if (choice == 1){
                newField();
            } else if (choice == 2){
                showField();
            } else if (choice == 3){
                amountOfSpecificNumbers();
            } else if (choice == 4){
                sumOfRows();
            } else if (choice == 5){
                sumOfColumns();
            }else {
                return;
            }
        }
    }
}


#1 楼

public class tenxten {


Java类应以大写字母开头,并且根据Java约定应以“ PascalCase”命名。像TenXTen这样的名称将遵守该约定。


static int numberRows = 10;
static int numberColumns = 10;


这些有效地用作常量(它们不变)。因此,它们可以是:

private static final int NUMBER_ROWS = 10;
private static final int NUMBER_COLUMNS = 10;


(常数按惯例以ALL_CAPS_AND_UNDERLINES命名)


static int [][] grid = new int [numberColumns][numberRows];


在一个地方写grid[y][x],在其他地方写grid[x][y]

对您来说,它的尺寸是相同的,所以您不会注意到,但是应该是下面的吗?

static int [][] grid = new int [numberRows][numberColumns];



Random rand = new Random();


您当前每次生成数字时都创建一个RandomRandom对象应重新使用(“更好的随机化”-我知道这听起来很模糊,但请相信我)。




 for (int y = 0; y < 10; y++) {
            for (int x = 0; x < 10; x++) {


请在此处使用常量作为xy的上限。最好删除newField的输出,然后调用如下方法: />
for (int i = 1; i < 10; i++) {
        for (int y = 0; y < 10; y++) {
            for (int x = 0; x < 10; x++) {



您的showField方法可以通过以下几种方式简化:


使用newField代替readInt,您不必在输出中除以do-while
不要使用外部循环,而应在嵌套循环后使用循环。

amountOfSpecificNumbers()不需要那么大,它目前的大小是100,但只需要10。

newField();
showField();




nitpick:有时您在写

int choice;
do {
    System.out.println("Pleas enter number 1, 2, 3, 4, 5, or 6");
    while (!scanner.hasNextInt()) {
        System.out.println("That's not even a number");
        System.out.println("Pleas enter number 1, 2, 3, 4, 5, or 6");
        scanner.next();
    }
    choice = scanner.nextInt();
}
while (choice > 6 || choice < 1);
return choice;


有时

private static void amountOfSpecificNumbers() {
    int[] numbers = new int[10];
    for (int y = 0; y < NUMBER_ROWS; y++) {
        for (int x = 0; x < NUMBER_COLUMNS; x++) {
            int value = grid[y][x];
            numbers[value]++;
        }
    }
    for (int i = 0; i < numbers.length; i++) {
        System.out.println(" " + numbers[i] + " " + i + "s" );
    }
}


虽然两者都可以在Java中运行,但我建议您坚持使用一个(我个人更喜欢numbers[i]++;


最后,假设您是否需要一次处理多个numbers[i] += i;网格。在这种情况下,您的程序确实需要i作为独立类。 (当前不需要它,但是它将很有用。)

您的许多方法都返回int[] numbers并在方法内部进行输出。最好返回一个输出所需的值,并在方法本身之外进行输出。

想象一下一个int[] array网格...谁说它始终必须为10 x 10 ?考虑名称TenXTen ...无论如何,请考虑使用以下方法的类:


TenXTen
void
TenXTen
NumberGrid
void generate()

然后您将可以使用这种方法,例如:

Java类和对象。

#2 楼

不要将数据存储在静态字段中

该程序中的最大问题是所有数据都存储在static字段中。方法,
,以便您可以有多个实例。

不需要多个Random实例


private static int randomInt(int from, int to) {
    Random rand = new Random();
    return rand.nextInt(to - from + 1) + from;
}



每次要生成新的int时,生成Random的新实例都是低效率的,完全没有必要。
创建单个Random实例并重用它会更好。

if-else简化switch


代替这些已链接的else-if:


if (choice == 1){
    newField();
} else if (choice == 2){
    showField();
} else if (choice == 3){
// ...



/>最好使用switch

switch (choice) {
    case 1:
        newField();
        break;
    case 2:
        showField();
        break;
    // ... 
}


使用一致的尺寸常数

grid使用numberColumnsnumberRows作为尺寸初始化:


static int[][] grid = new int[numberColumns][numberRows];



但是,在C语言中的其他任何地方颂歌,
使用硬编码数字10作为索引边界进行迭代
最好在那些迭代中重用numberColumnsnumberRows
当然,因为这些是常量,所以
常用的约定是用ALL CAP字母命名。

避免代码重复

readInt方法中包含重复的字符串,
浪费第一次评估choice


private static int readInt(Scanner scanner){
    int choice = 0;
    while(choice > 6 || choice < 1) {
        System.out.println("Pleas enter number 1, 2, 3, 4, 5, or 6");
        while (!scanner.hasNextInt()) {
            System.out.println("That's not even a number");
            System.out.println("Pleas enter number 1, 2, 3, 4, 5, or 6");
            scanner.next();
        }
        choice = scanner.nextInt();
    }
    return choice;
}



最好避免重复并转换为do-while循环:

private static int readInt(Scanner scanner) {
    String prompt = "Please enter number 1, 2, 3, 4, 5, or 6";
    int choice;
    do {
        System.out.println(prompt);
        while (!scanner.hasNextInt()) {
            System.out.println("That's not even a number");
            System.out.println(prompt);
            scanner.next();
        }
        choice = scanner.nextInt();
    } while (choice > 6 || choice < 1);
    return choice;
}


使用scanner.hasNext中的适当模式,您甚至可以做得更好,并且无需循环即可简化:

private static int readInt(Scanner scanner) {
    String prompt = "Please enter number 1, 2, 3, 4, 5, or 6";
    System.out.println(prompt);
    while (!scanner.hasNext("[1-6]")) {
        System.out.println(prompt);
        scanner.next();
    }
    return scanner.nextInt();
}