私のJavaは非常に錆びており、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 cogr」はunixでは「mysql-connect-grid」を実行し、win32では* .cmdを実行します)
- また、IOSのスタイルでは、ユーザーが省略形のコマンドを入力できるようにして、疑問符(?)を入力できるようにします。これにより、残りの(または次の)固有のコマンドオプション(「my?」など)に関するヒントが得られます。 mysqlを返し、「my?」は接続またはダンプを返します)。その他の戻り値は、一意でないコマンドまたは一致しなかったコマンドの場合、「あいまい」または「不明」になります。些細なことのように思えるかもしれませんが、各フォルダーには何百ものコマンドがあり、ユーザーは考えたくありません...
ディレクトリからファイルのリストを取得し、ファイルの配列を再調整する関数を作成しました。次に、動的にサイズ設定された潜在的なコマンドのグリッドを返す以下の方法を使用して、それを2次元配列に変換します。
/**********************************************************************************
* 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;
}
これは2次元配列(下)を返すので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のマッチャー関数に頭を悩ませているようには見えません。SQLの場合、次のようになります。
"SELECT DISTINCT col2 FROM cmd_Grid
WHERE col1 LIKE 'cmdToken1%' "
またはさらに良い:連続する各列にint深度マークを再帰的に設定する
`SELECT DISTINCT col+str(depthmark+1) FROM cmd_Grid
WHERE col+str(depthmark) LIKE 'cmdMatchedTokens%' "
完全に一致するまで。
必死になって試したjoSQLというパッケージを見つけましたが、Java6で動作させることができないようです。とにかく:私はまた、すべてが単一のクラスに含まれることができるように、純粋なJavaソリューションを望んでいました...
多分スキャナーか何かを使って多次元配列を解析して一意の値を探します...私はおそらくそれを必要以上に複雑にしていることを知っています。
正しい方向にゆっくりと微調整していただければ幸いです。
TIA