Java语言程序设计基础篇_编程练习题**16.30(模式识别:连续四个相同的数)

目录

题目:**16.30(模式识别:连续四个相同的数)

 习题思路

代码示例

 结果展示


题目:**16.30(模式识别:连续四个相同的数)

  为编程练习题8.19编写一个GUI程序。让用户在6行7列的网格的文本域中输入数字。如果存在一串四个相等的数字,用户单击Solve按钮后,可以高亮现实它们。初始的,文本域中的值随机填充了0到9的数字。

  •  习题思路
  1.  新建一个HBox,放置一个Label,表示当前文本域中是否有连续的四个数。
  2. 新建一个GridPane,创建一个6行7列的TextField[][]数组,在每一个TextField元素中随机添加一个0~9的数,并设置到GridPane中。
  3. 新建一个HBox,添加两个Button。
  4. 新建一个BorderPane,将第一个HBox设置在顶部,将GridPane设置在中心,第二个HBox放在底部。
  5. 定义一个判断文本域中是否有四个相同的数的方法,可以参考编程练习题8.19的方法。如果找到了四个相同的数,那么将四个输入框位置的坐标添加到另一个数组Int[4][2]中。
  6. 定义一个设置高亮方法,将Int[4][2]数组中保存的与TextField对应的位置的文本框的边框设置为某一种颜色。
  7. 定义一个清除高亮方法,使用for循环清除文本边框设置,同时清除Int[4][2]中的数字。
  8. 还可以为第一个HBox中的Label定义一个设置文本的方法,根据⑤中的方法返回值(或者用一个boolean的值代表是否有连续数),设置Label中的文本。
  • 代码示例

编程练习题16_30PatternRecognition.java

package chapter_16;

import java.util.Iterator;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class 编程练习题16_30PatternRecognition extends Application{
	private int[][] fourIndex = new int[4][2];
	private TextField[][] textList;
	private Label prompt;
	private boolean bool;
	@Override
	public void start(Stage primaryStage) throws Exception {
		textList = new TextField[6][7];
		prompt = new Label();
		HBox hBox = new HBox(prompt);
		hBox.setAlignment(Pos.CENTER);
		GridPane gridPane = new GridPane();
		gridPane.setPadding(new Insets(0, 15, 0, 15));
		for(int i = 0;i < textList.length;i++) {
			for(int j = 0;j < textList[i].length;j++) {
				int rand = (int)(Math.random()*10);
				textList[i][j] = new TextField(rand+"");
				gridPane.add(textList[i][j], i, j);
			}
		}
		Button btSolve = new Button("Solve");
		HBox hBox2 = new HBox(btSolve);
		hBox2.setAlignment(Pos.CENTER);
		
		BorderPane borderPane = new BorderPane();
		borderPane.setTop(hBox);
		borderPane.setCenter(gridPane);
		borderPane.setBottom(hBox2);
		
		btSolve.setOnAction(e ->{
		isConsecutiveFour(textList);
		System.out.println(bool);
		setLabelText();
		
	});
		Scene scene = new Scene(borderPane,200, 200);
		primaryStage.setTitle("编程练习题16_30PatternRecognition");
		primaryStage.setScene(scene);
		primaryStage.show();
	}
	public void setLabelText() {
		if(bool) {
			prompt.setText("A consecutive four found");
		}else {
			prompt.setText("Not a consecutive four found");
			clearHighlight();
			}
		}
	public void setHighlight(int[][] fourIndex) {
		clearHighlight();
			for(int i = 0;i < 4;i++) {
				int x;
				int y;
					x = fourIndex[i][1];
					y = fourIndex[i][0];
				textList[x][y].setStyle("-fx-border-color:Blue");
				System.out.println(x+","+y);
		}
			
	}
	public void clearHighlight() {  
	    if (textList != null) {  
	        for (int i = 0; i < textList.length; i++) {  
	            for (int j = 0; j < textList[i].length; j++) {  
	                textList[i][j].setStyle("");  
	            }  
	        }  
	    }  
		for(int i = 0;i < 4;i++) {
			fourIndex[i][0] = 0;
			fourIndex[i][0] = 0;
		}
	}
	public boolean isConsecutiveFour(TextField[][] values) {
		bool = false;
		 if (values == null || values.length == 0 || values[0].length == 0) {  
		        return false;  
		    }  
		  
		    // 初始化 fourIndex 数组  
		    int[][] fourIndex = new int[4][2];  
		  
		    // 判断行  
		    for (int i = 0; i < values.length; i++) {  
		        int countRow = 0;  
		        int startIndex = -1;  
		        for (int j = 0; j < values[i].length - 1; j++) {  
		            if (j > 0 && values[i][j].getText().equals(values[i][j - 1].getText())) {  
		                countRow++;  
		                if (startIndex == -1) {  
		                    startIndex = j - 1; // 记录连续序列的起始索引  
		                }  
		                if (countRow == 3) { // 已经是第四个连续的了  
		                    // 填充 fourIndex 数组(这里只填充最后四个索引)  
		                    for (int k = 0; k < 4; k++) {  
		                        fourIndex[k][0] = startIndex + k;  
		                        fourIndex[k][1] = i;  
		                    }  
		                    setHighlight(fourIndex);  
		                    bool = true;
		                    return true;  
		                }  
		            } else {  
		                countRow = 0;  
		                startIndex = -1;  
		            }  
		        }  
		    }  
		 // 判断列  
		    for (int j = 0; j < values[0].length; j++) { // 注意这里应该遍历列数  
		        int countColumn = 0;  
		        int startIndex = -1;  
		        for (int i = 0; i < values.length - 1; i++) { // 注意这里应该是 i < values.length - 1  
		            if (values[i][j].getText().equals(values[i + 1][j].getText())) { // 注意这里使用 i+1 而不是 i-1  
		                countColumn++;  
		                if (startIndex == -1) {  
		                    startIndex = i; // 记录连续序列的起始索引  
		                }  
		                if (countColumn == 3) { // 已经是第四个连续的了  
		                    // 填充 fourIndex 数组  
		                    for (int k = 0; k < 4; k++) {  
		                        fourIndex[k][0] = j; // 列索引不变  
		                        fourIndex[k][1] = startIndex + k; // 使用行索引的偏移  
		                    }  
		                    setHighlight(fourIndex);  
		                    bool = true;
		                    return true;  
		                }  
		            } else {  
		                countColumn = 0;  
		                startIndex = -1;  
		            }  
		        }  
		    }  
		      
		 // 判断左下到右上的对角线  
		    for (int i = 3; i < values.length; i++) { // 从第四行开始  
		        for (int j = 0; j < values[0].length; j++) { // 确保列索引不会超出范围  
		            int countDiagonal = 1; // 初始化计数器  
		            for (int k = 1; k <= 3; k++) { // 检查接下来的三个元素  
		                int ni = i - k; // 上一个元素的行索引  
		                int nj = j + k; // 下一个元素的列索引  
		                if (ni >= 0 && nj < values[0].length && // 确保索引不会越界  
		                    values[i][j].getText().equals(values[ni][nj].getText())) {  
		                    countDiagonal++; // 如果元素相同,增加计数器  
		                } else {  
		                    countDiagonal = 0; // 重置计数器,因为序列中断了  
		                    break; // 跳出内层循环  
		                }  
		            }  
		      
		            // 将判断移到内层循环外部  
		            if (countDiagonal == 4) { // 如果找到了四个相同的元素  
		                // 填充fourIndex  
		                for (int l = 0; l < 4; l++) {  
		                    fourIndex[l][1] = i - l; // 行索引递减  
		                    fourIndex[l][0] = j + l; // 列索引递增  
		                }  
		                setHighlight(fourIndex);  
		                bool = true;  
		                return true; // 找到后直接返回true  
		            }  
		        }  
		    } 
		 // 检查从左上角到右下角的次对角线  
		    for (int i = 0; i < values.length - 3; i++) { // 注意这里是 <=  
		        for (int j = 0; j < values[0].length - 3; j++) { // 注意这里是 <=  
		            if (values[i][j].getText().equals(values[i + 1][j + 1].getText()) &&  
		                values[i + 1][j + 1].getText().equals(values[i + 2][j + 2].getText()) &&  
		                values[i + 2][j + 2].getText().equals(values[i + 3][j + 3].getText())) {  
		                for (int k = 0; k < 4; k++) {  
		                    fourIndex[k][1] = i + k; // 行索引  
		                    fourIndex[k][0] = j + k; // 列索引  
		                }  
		                setHighlight(fourIndex);  
		                bool = true;  
		                return true; // 找到后直接返回true  
		            }  
		        }  
		    } 
		return false;
	}
	public static void main(String[] args) {
		Application.launch(args);
	}
	
}
  •  结果展示

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是200个符合要求的字(每行显示10个): 35.56 86.94 58.10 36.44 38.62 97.34 69.83 46.13 74.45 23.13 28.54 16.91 57.05 25.31 11.66 71.27 49.28 75.85 87.38 53.87 80.67 29.62 65.48 40.16 98.36 84.66 84.84 89.87 50.39 88.81 72.73 51.03 53.25 34.95 96.84 23.26 95.17 78.88 26.34 64.10 68.41 89.01 93.12 82.38 12.15 51.23 12.28 85.62 22.61 57.38 13.67 84.67 95.36 94.93 86.94 27.91 71.36 91.33 88.25 56.78 99.47 94.52 63.41 60.63 99.94 58.74 66.22 96.03 44.09 84.35 8.43 16.96 45.23 97.01 3.08 10.75 39.37 65.03 61.49 79.03 81.69 42.46 74.87 1.35 27.78 27.41 71.74 19.07 76.04 69.92 24.81 13.58 97.55 42.21 37.00 21.05 29.63 24.38 4.94 10.75 55.05 39.64 84.55 50.26 91.18 51.90 30.81 68.95 21.33 16.15 77.57 47.41 45.84 18.28 18.08 98.53 63.84 57.77 61.88 96.20 49.02 79.13 4.47 94.11 11.08 68.39 81.55 13.44 94.00 48.60 61.74 50.90 65.03 17.35 90.86 7.16 50.97 4.49 76.73 19.12 3.72 15.37 92.72 53.97 2.80 33.53 16.30 9.62 71.82 98.56 93.53 23.67 10.15 93.72 9.97 82.01 21.90 8.89 96.31 58.99 42.04 19.87 30.25 51.72 95.25 79.22 92.67 50.44 5.24 8.40 6.34 60.05 39.23 22.52 46.88 82.50 49.61 23.58 19.80 76.08 87.23 47.36 47.54 23.02 94.07 56.08 46.15 30.93 38.25 10.80 78.93 9.08 47.90 62.77 39.33 40.53 91.20 69.47 23.11 82.31 7.01 99.51 21.98 91.08 20.44 14.05 29.85 60.80 27.74 71.57 98.54 95.41 72.45 5.99 50.81 40.23 12.65 58.17 39.50 96.02 67.35 70.23 22.19 53.95 77.82 53.28 17.17 38.05 12.54 20.47 66.94 90.15 66.60 1.56 43.13 67.63 72.11 3.63 89.93 49.47 59.45 80.82 85.69 40.34 28.23 26.08 31.65 31.53 28.10 2.75 46.58 48.00 77.71 54.95 75.40 29.15 91.48 74.23 34.61 26.34 79.34 14.85 5.32 30.56 88.04 56.96 20.83 36.07 65.76 55.81 57.37 66.48 60.13 26.26 92.14 4.68 9.86 22.11 90.82 8.50 77.17 33.12 95.92 63.95 49.36 78.03 63.65 89.54 66.44 47.75 70.14 83.34 4.09 94.35 32.52 88.12 24.28 20.59 27.25 91.85 55.92 76.41 68.15 2.07 71.65 92.91 78.44 30.47 37.51 76.16 5.83 49.10 45.69 63.06 69.88 27.08 90.73 82.25 54.97 8.45 44.51 78.38 48.07 77.84 14.92 23.07 58.48 15.34 90.17 18.13 56.50 11.83 67.59 45.08 16.29 99.22 56.26 72.43 83.30 14.43 70.21 87.07 37.82 22.45 9.66 20.98 76.44 25.72 83.64 66.77 7.70 57.71 88.17 74.92 91.87 75.00 2.09 73.08 22.99 16.04 33.91 48.29 1.57 81.48 91.43 75.25 30.34 58.59 75.15 79.80 82.77 21.81 75.04 44.75 49.01 42.87 94.03 66.22 98.07 43.05 90.44 59.81 13.83 49.56 27.36 87.66 50.71 18.88 23.80 91.66 79.79 1.37 6.49 57.94 18.43 17.21 41.77 71.10 67.15 79.11 49.76 44.57 91.46 18.25 53.73 83.98 97.88 34.07 28.86 65.54 38.24 28.97 59.51 57.87 45.93 75.55 73.03 83.51 77.50 85.58 34.19 41.97 5.89 47.29 27.17 88.68 99.09 38.91 65.15 44.71 55.39 2.21 33.96 61.99 60.72 81.43 31.70 69.61 4.62 47.26 63.52 49.45 9.22 90.13 2.54 77.10 35.11 56.84 84.58 58.32
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值