sudoku.java

来自「Semantic Web Ontology Editor」· Java 代码 · 共 1,029 行 · 第 1/3 页

JAVA
1,029
字号
				String val = "#"+String.valueOf((int) Math.pow(i,2));
				if (this.useIndividuals && gridOnt.getIndividual(new URI(SUDOKU_NS+val))!=null) {
					num = (int) Math.pow(i,2);
					break;
				}
				if (!this.useIndividuals && gridOnt.getClass(new URI(SUDOKU_NS+val))!=null) {
					num = (int) Math.pow(i,2);
					break;
				}
			}
			if (dimen!=num) {
				this.dimen = num;
				this.subdim = (int) Math.sqrt(dimen);
				this.getContentPane().removeAll();
				this.setupUI();
				this.repaint();
			}
			
			// populate table
			SwoopToldReasoner reas = new SwoopToldReasoner();
			reas.setOntology(gridOnt);
			for (int g=1; g<=dimen; g++) {
				for (int i=1; i<=subdim; i++) {
					for (int j=1; j<=subdim; j++) {
						OWLEntity ent = null;
						String val = "";
						if (this.useIndividuals) {
							String cell = "#V"+String.valueOf(g)+"_"+String.valueOf(i)+String.valueOf(j);
							ent = gridOnt.getIndividual(new URI(SUDOKU_NS+cell));							
						}
						else {
							String cell = "#C"+String.valueOf(g)+"_"+String.valueOf(i)+String.valueOf(j);
							ent = gridOnt.getClass(new URI(SUDOKU_NS+cell));
						}
						if (ent==null) {
							JOptionPane.showMessageDialog(this, "Error: Invalid Grid Dimensions", "Load Error", JOptionPane.ERROR_MESSAGE);
							return;
						}
						else {
							// get value
							Set equ = new HashSet();
							if (this.useIndividuals) equ = reas.getSameAsIndividuals((OWLIndividual) ent);
							else equ = reas.equivalentClassesOf((OWLClass) ent);
							for (Iterator iter = equ.iterator(); iter.hasNext();) {
								OWLEntity eq = (OWLEntity) iter.next();
								if (eq.getURI().toString().indexOf("#V")==-1 && eq.getURI().toString().indexOf("#C")==-1 && eq.getURI().toString().indexOf("#T")==-1) {
									val = eq.getURI().toString();
									val = val.substring(val.indexOf("#")+1, val.length());
									break;
								}												
							}							
						}
						// map g,i,j to row,col
						int row = ((g - 1) / subdim) * subdim + i;
						int c = g % subdim;
						if (c==0) c = subdim;
						int col = (c-1) * subdim + j;
						table.setValueAt(val, row-1, col-1);						
					}
				}
			}
			table.updateUI();
		}
		catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	
	private void saveOWLGrid() {
		try {
			JFileChooser wrapChooser = new JFileChooser();
			File saveFile = null;
			int returnVal = wrapChooser.showSaveDialog(this);
			if (returnVal == JFileChooser.APPROVE_OPTION) {
				saveFile = wrapChooser.getSelectedFile();
			} else { // save cancelled
				return;
			}
			
			// prompt user if overwriting
			if (saveFile.exists()) {
				int result = JOptionPane.showConfirmDialog(this, "Saving File at " + saveFile.getAbsolutePath() + ". Overwrite?", "Save Ontology", JOptionPane.YES_NO_OPTION);
				if (result != JOptionPane.YES_OPTION) return;
			}
			
			// write ontology file
			FileWriter fw = new FileWriter(saveFile);
			this.generatePopulatedSudokuOWLGrid();
			fw.write(this.getRDFXMLGridOnt());
			fw.close();
			System.out.println("Saved grid to file: "+saveFile.getName());
			JOptionPane.showMessageDialog(this, "Saved grid to file: "+saveFile.getName(), "Saving Sudoko OWL Ontology", JOptionPane.INFORMATION_MESSAGE);			
		}
		catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	
	private void popupExplanation(int row, int col) {
		try {
			// translate dimensions to to g, i, j
			int g = ((row-1) / subdim) * subdim + 1 + ((int) (col-1) / subdim);
			int i = row % subdim;
			if (i==0) i = subdim;
			int j = col % subdim;
			if (j==0) j = subdim;
			String val = table.getValueAt(row-1, col-1).toString();
			
			if (!val.equals("") && this.useIndividuals) {
				
				// Cg_ij has instance value
				
				// get explanation
				ConciseFormatEntityRenderer cfRend = new ConciseFormatEntityRenderer(); // swoopHandler.termDisplay.renderers.get(0);
				cfRend.setSwoopModel(swoopModel);
				cfRend.visitor = cfRend.createVisitor();
				OWLIndividual ind = gridOnt.getIndividual(new URI(SUDOKU_NS+"#"+val));
				OWLClass cla = gridOnt.getClass(new URI(SUDOKU_NS+"#C"+String.valueOf(g)+"_"+String.valueOf(i)+String.valueOf(j)));
				String expl = cfRend.getSudokuExplanation(gridOnt, ind, cla);
				String nlExpl = "<html><body><font face=\"Verdana\" size=2>";
				nlExpl += "<b>Cell ("+row+","+col+")</b> has value <b>"+val+"</b> because...<br><hr><font face=\"Verdana\" size=2>";
				nlExpl += "Each cell must have <b>one of</b> the values [1..."+String.valueOf(dimen)+"] <i>[constraint]</i><br>";
				List nlList = new ArrayList();
				// parse explanation to add NL
				String[] st = expl.split("<br>");
				for (int s=0; s<st.length; s++) {
					String line = st[s];
					String nl = "";
					
//					System.out.println(line);
					
					if (line.indexOf("SameIndividual")>=0) {
						String token = "\">";
						int pos = line.indexOf(token)+2;
						String val1 = line.substring(pos, line.indexOf("<", pos));
						int pos2 = line.indexOf(token, pos)+2;
						String val2 = line.substring(pos2, line.indexOf("<", pos2));
						if (val2.indexOf("V")>=0) {
							String temp = val1;
							val1 = val2;
							val2 = temp;
						}
						String gs = val1.substring(1,2);
						String is = val1.substring(3,4);
						String js = val1.substring(4,5);
						g = Integer.parseInt(gs);
						i = Integer.parseInt(is);
						j = Integer.parseInt(js);
						row = ((g - 1) / subdim) * subdim + i;
						int c = g % subdim;
						if (c==0) c = subdim;
						col = (c-1) * subdim + j;
						nl = "<b>Cell ("+row+","+col+")</b> has value "+val2 + " <i>[given]</i>";						
					}
					else {
						// check grid
						for (g=1; g<=dimen; g++) {
							boolean match = true;
							for (i=1; i<=subdim; i++) {
								for (j=1; j<=subdim; j++) {
									String cell = "V"+String.valueOf(g)+"_"+String.valueOf(i)+String.valueOf(j);
									if (line.indexOf(cell)==-1) {
										match = false;
										break;
									}
								}
							}
							if (match) {
								nl = "<b>Grid "+String.valueOf(g)+"</b> must have all values different <i>[constraint]</i>";
								break;
							}
						}
						if (nl.equals("")) {
							// check row
							for (g=1; g<=dimen; g+=subdim) {
								for (i=1; i<=subdim; i++) {
									boolean match = true;
									for (int sg=g; sg<=(g+subdim-1); sg++) {
										for (j=1; j<=subdim; j++) {
											String cell = "V"+String.valueOf(g)+"_"+String.valueOf(i)+String.valueOf(j);
											if (line.indexOf(cell)==-1) {
												match = false;
												break;
											}							
										}
									}
									if (match) {
										row = ((g - 1) / subdim) * subdim + i;
										nl = "<b>Row "+row+"</b> must have all values different <i>[constraint]</i>";
										break;
									}
								}				
							}
						}
						if (nl.equals("")) {
							// check columns
							for (g=1; g<=subdim; g++) {
								for (j=1; j<=subdim; j++) {
									boolean match = true;
									for (int sg=g; sg<=dimen; sg+=subdim) {
										for (i=1; i<=subdim; i++) {
											String cell = "V"+String.valueOf(g)+"_"+String.valueOf(i)+String.valueOf(j);
											if (line.indexOf(cell)==-1) {
												match = false;
												break;
											}							
										}
									}
									if (match) {
										int c = g % subdim;
										if (c==0) c = subdim;
										col = (c-1) * subdim + j;
										nl = "<b>Column "+col+"</b> must have all values different <i>[constraint]</i>";
										break;
									}
								}				
							}
						}
					}					
//					System.out.println("--->"+nl);
					if (!nl.equals("")) nlList.add(nl); //nlExpl += nl+"<br>"; 					
				}
				
				// post process to *order* NL
				while (!nlList.isEmpty()) {
					boolean findVal = false;
					String valLine = "";
					for (Iterator iter = nlList.iterator(); iter.hasNext();) {
						String line = (String) iter.next();
						if (line.indexOf("has value")>=0) {
							findVal = true;
							valLine = line;
							break;
						}
					}
					if (findVal) {
						nlList.remove(valLine);
						// add findVal to output
						nlExpl += valLine + "<br>";
						String rs = valLine.substring(valLine.indexOf("(")+1, valLine.indexOf(","));
						String cs = valLine.substring(valLine.indexOf(",")+1, valLine.indexOf(")"));
						row = Integer.parseInt(rs);
						col = Integer.parseInt(cs);
						
						// add all grid/row/col constraints after this line
						for (Iterator iter = new ArrayList(nlList).iterator(); iter.hasNext();) {
							String line = (String) iter.next();
							boolean match = false;
							if (line.indexOf("Grid")>=0) {
								int pos = line.indexOf("Grid")+5;
								String gs = line.substring(pos, line.indexOf("</b>")).trim();
								g = Integer.parseInt(gs);
								// check if row,col appear in g
								if (g == ((row-1) / subdim) * subdim + 1 + ((int) (col-1) / subdim)) match = true;
							}
							else if (line.indexOf("Row")>=0) {
								int pos = line.indexOf("Row")+4;
								String is = line.substring(pos, line.indexOf("</b>")).trim();
								i = Integer.parseInt(is);
								// check if i matches
								if (i==row) match = true;
							}
							else if (line.indexOf("Column")>=0) {
								int pos = line.indexOf("Column")+7;
								String js = line.substring(pos, line.indexOf("</b>")).trim();
								j = Integer.parseInt(js);
								// check if j matches 
								if (col==j) match = true;
							}
							if (match) {
								nlExpl += "|_" + line + "<br>";
								nlList.remove(line);
							}
						}
					}
					else {
						// flush remaining constraints
						for (Iterator iter = nlList.iterator(); iter.hasNext();) {
							String line = (String) iter.next();
							nlExpl += line + "<br>";
						}
						nlList.clear();
					}
				}
				
				nlExpl += "</body></html>";
				
				// display explanation in popup
				JFrame popup = new JFrame("Explanation");
				Container content  = popup.getContentPane();
				content.setLayout(new GridLayout(1,1));
				JEditorPane htmlPane = new JEditorPane();
				htmlPane.setEditable(false);
				htmlPane.setContentType("text/html");
				htmlPane.setText(nlExpl);
				htmlPane.setCaretPosition(0);
				content.add(new JScrollPane(htmlPane));
				popup.setSize(400, 200);
				popup.setLocation(300, 300);
				popup.show();
			}
		}
		catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	
	public void mouseClicked(MouseEvent e) {
		if (e.getSource() == table) {			
			if (e.getButton() == MouseEvent.BUTTON3) {
				// popup menu on right click
				int row = table.rowAtPoint(e.getPoint());
				int col = table.columnAtPoint(e.getPoint());
				this.popupExplanation(row+1, col+1);
			}
		}
	}
	public void mousePressed(MouseEvent arg0) {
	}
	public void mouseReleased(MouseEvent arg0) {
	}
	public void mouseEntered(MouseEvent arg0) {
	}
	public void mouseExited(MouseEvent arg0) {
	}
	
	private void changeDimensions() {
		String result = JOptionPane.showInputDialog(this, "Specify New Dimensions", "Puzzle Grid", JOptionPane.INFORMATION_MESSAGE);
		if (result!=null) {
			int num = Integer.parseInt(result);
			if (Math.sqrt(num) != ((int) Math.sqrt(num))) {
				JOptionPane.showMessageDialog(this, "Error: Invalid Grid Dimensions - Number needs to be a perfect square", "Dimension Error", JOptionPane.ERROR_MESSAGE);
				return;
			}
			this.dimen = num;
			this.subdim = (int) Math.sqrt(dimen);
			this.getContentPane().removeAll();
			this.setupUI();
			this.repaint();
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?