Моя Java чрезвычайно ржавая, и я застрял, пытаясь создать пользовательский интерфейс, который упрощает выполнение сценариев оболочки или пакетных файлов в зависимости от того, будет ли это Linus или Win32 соответственно. Файлы имеют следующие правила именования.
module-verb-object-etc [args-list]
mysql-connect-grid
mysql-connect-rds
mysql-dump-grid
mysql-dump-grid-se314
в конечном итоге я бы хотел, чтобы он разбирал недвусмысленные термины, чтобы я мог:
- токенизируйте команды (например, разделенные символом "-") и сократите их до упрощенных терминов, таких как окно команд foxpro или IOS cisco (например, "my co gr" выполняет "mysql-connect-grid" в unix и * .cmd в win32)
- , а также в стиле IOS позволяют пользователю вводить сокращенные команды, чтобы они могли вводить знак вопроса (?), И это даст им подсказку об уникальных оставшихся (или следующих) параметрах команды (например, " my? "возвращает mysql &" my? "возвращает connect или dump). Другие возвращаемые значения будут «неоднозначными» или «неизвестными» для команд, которые не являются уникальными или не могут быть сопоставлены. Это может показаться тривиальным, но в каждой папке много сотен команд, и мои пользователи не хотят думать ...
Я написал функцию для извлечения списка файлов из каталога и повторного запуска массива fileanmes. Затем я преобразую это в двухмерный массив, используя метод, приведенный ниже, который возвращает динамически измеренную сетку потенциальных команд.
/**********************************************************************************
* 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]
- это "похоже" cmdToken[1]
, так что мои пользователи могут собрать команду, пока "my du gr ?"
не вернет "ENTER, [se314]"
- если это имеет смысл ...
String[][] makeGrid:
mysql dump grid se314
mysql connect grid
mysql dump grid
mysql connect rds
My Challenge: Кажется, я не могу разобраться с функцией соответствия в 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, чтобы все могло содержаться в одном классе ...
Может быть, с помощью сканера или чего-то еще для анализа моего многомерного массива на предмет уникальных значений ... Я знаю, что, вероятно, делаю его более сложным, чем нужно.
будет приветствоваться легкое толчок в правильном направлении.
ТИА