我的 Java 非常生疏,我一直在尝试制作一个用户界面,以简化 shell 脚本或批处理文件的执行,具体取决于它是分别是 Linus 还是 Win32。这些文件具有以下命名约定。
module-verb-object-etc [args-list]
mysql-connect-grid
mysql-connect-rds
mysql-dump-grid
mysql-dump-grid-se314
最终我希望它解析明确的术语,以便我可以:
- 标记命令(例如用“-”分隔)并将它们缩短为简化的术语,例如 foxpro 的命令窗口或 cisco 的 IOS(例如,“my co gr”在 unix 中执行“mysql-connect-grid”,在 win32 中执行 *.cmd)
- 并且以 IOS 的风格允许用户输入缩写命令,以便他们可以输入问号 (?),它会提示他们唯一的剩余(或下一个)命令选项(例如“我的?”返回 mysql & "my ?" 返回连接或转储)。对于不唯一或无法匹配的命令,其他返回值将是“不明确的”或“未知的”。这可能看起来微不足道,但每个文件夹中有数百个命令,我的用户不想思考......
我编写了一个函数来从目录中提取文件列表并重新调整文件数组。然后我使用下面的方法将其转换为二维数组,该方法返回一个动态大小的潜在命令网格。
/**********************************************************************************
* MAKE GRID: Parses array of filenames and tokenizes AWS cmds.
* @param strs Array of filenames
**********************************************************************************/
public static String [][] makeGrid(String strs[], boolean bPrint) {
String tmpGrid[][];
int nMaxCols = 0;
int nRows = uniqueCount(strs);
int nGridRow = 0;
tmpGrid = new String [nRows][];
for (int nRow=0; nRow<nRows; nRow++) {
String cFilename = strs[nRow];
if (!cFilename.endsWith(".cmd") // just list unix files (filter for batch files)
&& cFilename.indexOf("-") > 0 ) // make sure there's a dash in the filename
{
String strTokens[] = tokenize(strs[nRow], "-"); // the dash is our token deliminator
int nCols = strTokens.length;
if (nCols>nMaxCols) nMaxCols=nCols;
tmpGrid[nGridRow] = new String [nCols];
for (int nCol=0; nCol<nCols; nCol++) {
tmpGrid[nGridRow][nCol] = strTokens[nCol];
if (bPrint) System.out.print(" "+tmpGrid[nGridRow][nCol]);
}
nGridRow++;
if (bPrint) System.out.println("");
} //end-if
}
String[][] cmdGrid = new String[nGridRow][nMaxCols];
System.arraycopy(tmpGrid, 0, cmdGrid, 0, nGridRow); // removes null rows (&NPEs!)
return cmdGrid;
}
这将返回一个二维数组(如下),grid[Row-N][Col-0]
匹配也是如此。我只想提取row[0]
通配符匹配为cmdToken[0] && row[1]
“like”的不同值,cmdToken[1]
以便我的用户可以拼凑一个命令直到"my du gr ?"
返回"ENTER, [se314]"
- 如果这有意义的话......
String[][] makeGrid:
mysql dump grid se314
mysql connect grid
mysql dump grid
mysql connect rds
我的挑战:我似乎无法理解我在 java 中的 matcher 函数。如果是 SQL,它将类似于:
"SELECT DISTINCT col2 FROM cmd_Grid
WHERE col1 LIKE 'cmdToken1%' "
甚至更好:递归地为每个连续列设置一个 int depthmark
`SELECT DISTINCT col+str(depthmark+1) FROM cmd_Grid
WHERE col+str(depthmark) LIKE 'cmdMatchedTokens%' "
直到你有一个完全匹配。
我发现了一个名为 joSQL 的包,我绝望地尝试了它,但我似乎无法让它在 Java6 中工作。无论如何:我也希望有一个纯 Java 解决方案,以便所有内容都可以包含在一个类中......
也许使用扫描仪或其他东西来解析我的多维数组以获得唯一值......我知道我可能让它变得比它需要的更复杂。
向正确方向轻推将不胜感激。
TIA