创建一个新网格
查看当前网格
计算网格中每个数字的数量/>对行求和
对列求和
退出程序
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();
您当前每次生成数字时都创建一个
Random
。 Random
对象应重新使用(“更好的随机化”-我知道这听起来很模糊,但请相信我)。和
for (int y = 0; y < 10; y++) {
for (int x = 0; x < 10; x++) {
请在此处使用常量作为
x
和y
的上限。最好删除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
使用numberColumns
和numberRows
作为尺寸初始化: static int[][] grid = new int[numberColumns][numberRows];
但是,在C语言中的其他任何地方颂歌,
使用硬编码数字10作为索引边界进行迭代
最好在那些迭代中重用
numberColumns
和numberRows
。当然,因为这些是常量,所以
常用的约定是用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();
}