Сетка и меню вошли в программу

Программа, которая создает сетку 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;
            }
        }
    }
}
28 голосов | спросил Henrik Bohlin 19 Jpm1000000pmMon, 19 Jan 2015 22:08:35 +030015 2015, 22:08:35

2 ответа


23
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();

В настоящее время вы создаете один Random каждый раз, когда вы производите номер. Random предназначены для повторного использования (для «лучшей рандомизации» - я знаю, что это звучит нечетко, но доверяйте мне на этом).


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

и

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

Используйте константы для верхней границы для x и y здесь.


newField имеет некоторое дублирование из showField. Возможно, лучше удалить вывод из newField и вызвать следующие методы:

newField();
showField();

Я считаю, что ваш метод readInt можно переписать с помощью do-while,

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;

Ваш метод amountOfSpecificNumbers() может быть упрощен несколькими способами:

  • используйте numbers[i]++; вместо numbers[i] += i;, и вам не придется делиться на i на выходе.
  • не используйте внешний цикл, используйте цикл после вложенного цикла вместо
  • int[] numbers не обязательно должен быть таким большим, он в настоящее время 100, но должен быть только 10.

    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" );
        }
    }
    

Немного nitpick: Иногда вы пишете

int[] array

, а иногда

int array[]

, хотя оба работают на Java, я бы рекомендовал придерживаться одного (я лично предпочитаю int[] array)


Наконец, представьте, если бы у вас было требование обрабатывать более одной сетки TenXTen за раз. В этом случае ваша программа действительно нуждалась бы TenXTen в качестве независимого класса. (В настоящее время он не нужен, но это было бы полезно).

Многие из ваших методов возвращают void и выполняют вывод внутри метода. Лучше всего вернуть значения, необходимые для вывода, и сделать вывод за пределамисамого метода.

Представьте себе TenXTen grid ... кто сказал, что он должен быть 10 x 10 в любое время? Рассмотрим имя NumberGrid ... в любом случае, рассмотрим класс с помощью этих методов:

  • void generate()
  • int[] amountOfSpecificNumbers()
  • int[] sumOfColumns()
  • int[] sumOfRows()
  • void showField()

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

public static void main(String[] args) {
    NumberGrid grid = new NumberGrid(20, 10);
    grid.showField();
    System.out.println(Arrays.toString(grid.sumOfColumns()));
    grid.generate();
}

и т. д. ... вы можете прочитать на Java-классы и объекты для этого.

ответил Simon Forsberg 19 Jpm1000000pmMon, 19 Jan 2015 22:28:50 +030015 2015, 22:28:50
14

Не хранить данные в статических полях

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

Нет необходимости в нескольких экземплярах Random

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

Неэффективно и совершенно необязательно генерировать новый экземпляр Random каждый раз, когда вы хотите сгенерировать новый int. Было бы лучше создать один экземпляр Random и повторно использовать его.

Упростить цепочку if-else с помощью switch

Вместо этих цепочек else-ifs:

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 инициализируется с помощью numberColumns и numberRows как размеры:

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

Но тогда, всюду в коде, вы выполняете итерацию с использованием жесткокодированного номера 10 в качестве индекса Было бы лучше повторно использовать numberColumns и numberRows в этих итерациях. И, конечно, поскольку это константы, общее соглашение называет их всеми буквами 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();
}
ответил janos 19 Jpm1000000pmMon, 19 Jan 2015 22:27:29 +030015 2015, 22:27:29

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132