2010-01-19 4 views
0

Java가 매우 녹슬어서 Linus인지 Win32인지에 따라 쉘 스크립트 나 배치 파일의 실행을 단순화하는 사용자 인터페이스를 만들려고 노력하고 있습니다. 파일의 이름 지정 규칙은 다음과 같습니다. &은 FoxPro 프로그램의 명령 창 또는 시스코의 같은 단순화 된 용어 soemthing로 단축 - (""예,로 구분) 명령 토큰 화Java Shell 와일드 카드 토크 나이 자

  1. :

    module-verb-object-etc [args-list] 
        mysql-connect-grid 
        mysql-connect-rds 
        mysql-dump-grid 
        mysql-dump-grid-se314 
    

    궁극적으로 나는 내가 할 수 있도록 명확한 용어를 구문 분석하는 데 싶습니다 IOS (예 : "my co gr"은 유닉스에서는 "mysql-connect-grid"를, win32에서는 * .cmd를 실행합니다)

  2. 또한 IOS 스타일로 사용자가 질문을 입력 할 수 있도록 축약 된 명령을 입력 할 수 있습니다 기호 (?)를 입력하면 고유 한 나머지 (또는 다음) 명령 옵션에 대한 힌트가 제공됩니다 (예 : "my ? "를 반환하면 mysql &"my? "가 connect 또는 dump를 반환합니다. Othr 반환 값은 고유하지 않거나 일치 할 수없는 명령에 대해 "모호"또는 "알 수 없음"입니다.

내가의 배열을 retun & 디렉토리에서 파일 목록을 뽑아 함수를 쓴 ... 그것은 사소한 것처럼 보일 수 있지만 각 폴더의 명령 수백이있다 내 사용자는 생각하고 싶지 않아 fileanmes. 그런 다음 잠재적 인 명령의 동적 크기가 조정 된 격자를 반환하는 아래의 방법을 사용하여 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]에 대한 와일드 카드 일치 내 사용자가 "my du gr ?" 반환 "ENTER, [se314]" 때까지 함께 명령을 잇 수 있도록 cmdToken[1] "와 같은"입니다 어디 별개의 값을 끌어하고 싶습니다 - 그 말이 있다면 ...

String[][] makeGrid: 
    mysql dump grid se314 
    mysql connect grid 
    mysql dump grid 
    mysql connect rds 

내 도전 과제 : java에서 matcher 함수를 사용하여 머리를 맞대는 것 같다.

"SELECT DISTINCT col2 FROM cmd_Grid 
    WHERE col1 LIKE 'cmdToken1%' " 

또는 더 나은 :이 SQL 인 경우는 같은 될 것입니다 당신이 정확하게 일치 할 때까지 반복적으로 각 연속 열

`SELECT DISTINCT col+str(depthmark+1) FROM cmd_Grid 
    WHERE col+str(depthmark) LIKE 'cmdMatchedTokens%' " 

에 대한 INT의 depthmark 설정.

필자는 필사적으로 노력한 joSQL라는 패키지를 발견했지만 Java6에서 작동시키지 못하는 것 같습니다. 어쨌든 : 모든 클래스가 하나의 클래스에 포함될 수 있도록 순수한 자바 솔루션을 기대하고있었습니다.

아마도 다차원 배열을 고유 한 값으로 구문 분석 할 스캐너 나 무언가를 사용했을 것입니다. 그것이 필요로하는 것보다 훨씬 더 복잡하게 만듭니다.

올바른 방향으로 부드럽게 움직여 주시면 감사하겠습니다.

TIA

+0

나는 왜 그것이 메소드에 대한 코드를 죽였는 지 모르겠다. 그러나 나는 그것이 중요하지 않다고 생각한다. 나도 꽤 다음 부분 중 하나를 작동하지만 java.lang.ProcessBuilder 함수에 전달하여 다른 독립형 Java 프로그램이나 스크립트 또는 배치 파일을 실행합니다. OS에 따라 매우 흥미 롭습니다. – WWWIZARDS

답변

0

키가 내 공동 할머니 '와 같은 가능한 짧은 명령은 "및 해당 값은"MySQL은 - 연결 - 그리드 있도록 하나의 완전한 해결책은 "해시 맵을 contruct 할 수 있습니다. 그래서이 것 해시 맵에서 값으로 "mysql-connect-grid"값을 갖습니다.

그러나 이것은 가능한 키의 수가 제한되어있는 경우에만 실현 가능한 해결책입니다. 그렇지 않은 경우 내장 된 문자열 구문 분석 방법을 사용할 수 있습니다. 예를 들어

:

String[][] makeGrid = new String[][]{{"mysql", "dump", "grid", "se314"}, 
       {"mysql", "connect", "grid", ""}, 
       {"mysql", "dump", "grid", ""}, 
       {"mysql", "connect", "rds", ""} 
       }; 
    String[] query2 = new String[]{"my", "du", "gr"}; 

    String[][] matchingCommands = new String[4][4]; 
    int resultSize = 0; 
    for(int i=0; i<makeGrid.length; i++) 
    { 
     String[] commandColumn = makeGrid[i]; 
    boolean matches = false; 
     for(int cnt=0; cnt<commandColumn.length; cnt++) 
     { 
     String commandPart = commandColumn[cnt]; 
     if(cnt < query2.length){ 
     String queryPart = query2[cnt]; 
    if(commandPart.startsWith(queryPart) || queryPart.equals("?")){ 
     matches = true; 
     }else{ 
     matches = false; 
     break; 
     } 
     } 
     } 
     if(matches){ 
     matchingCommands[resultSize] = commandColumn; 
     resultSize++; 
     } 
    } 

이 코드는 당신이 그것에 대해 이동하는 방법에 대한 몇 가지 아이디어를 줄 것이다. 여기에 유의해야 할 것이 하나 있습니다. matchingCommands 배열이 4 행 4 열로 초기화되었으므로 일치하지 않으므로 낭비입니다. 이 작업을보다 효율적으로 수행하는 데 도움이 필요하면 알려주십시오. 그렇지 않으면, 이것은 내가 생각하는 코드의 작업 조각입니다.

+0

매우 흥미 롭습니다 ... 빠른 답장을 보내 주셔서 감사합니다 . 해시지도로 시도했지만 너무 털이 많습니다. 정확한 세부 정보는 기억이 나지 않지만 중복 키와 동일한 문제가 있다고 생각합니다. 나는 또한 동적 배열 차원의 b/c를 포기했다 .. 기본적으로 cmdGrid 행은 임의의 수의 열을 가질 수 있지만 가장 좋은 것은 아니지만 빈 문자열로 널 요소를 채우는 아이디어를 내게 주었다. 작업. – WWWIZARDS

0

지금 나는 공백 구분 기호 & 배열을 토큰 화하기 위해 각 cmdString (쿼리)을 구문 분석하는 데 몰두하고있었습니다. 다음과 같음 :

Scanner sCmdString = new Scanner(cInput); 
while (sCmdString.hasNext()) { 
String cToken = sCmdString.next().toUpperCase().trim(); 
System.out.println(" "+cToken+" "); 
// match cmdString[i..n] to cmdGrid 
for (int nRow=0; nRow < cmdGrid.length; nRow++) { 
     for (int nCol=0; nCol < cmdGrid[nRow].length; nCol++) { 
    if (cmdGrid[nRow][nCol].equalsIgnoreCase(cToken)) 
    System.out.println("MATCH: "+cmdGrid[nRow][nCol]); 
    else System.out.println("NO MATCH:"+cmdGrid[nRow][nCol].toUpperCase()+":"+cToken+"..."); 
     } 
    } 
    } 

그러나 불규칙한 행 길이의 NPE가 나타납니다.

저는 열을 평평하게 만드는 아이디어를 좋아합니다.

아직 중복을 제거해야한다고 생각합니다 ... 아니요?

1

배열 대신 ArrayList와 같은 고급 데이터 구조를 사용하고 StringTokenizer를 사용하여 각 명령을 즉시 생성 할 수도 있습니다.

ArrayList<String> matchingCommands = new ArrayList<String>(); 

    ArrayList<String> commandList = new ArrayList<String>(); 
    commandList.add("mysql dump grid se314"); 
    commandList.add("mysql connect grid"); 
    commandList.add("mysql dump grid"); 
    commandList.add("mysql connect rds"); 

    String queryCommand = "my du gr ?"; 

    for(int i=0; i<commandList.size(); i++) 
    { 
     boolean matches = false; 
     String command = commandList.get(i); 
     StringTokenizer commandTokenizer = new StringTokenizer(command, " "); // Using space as the deliminator 
     StringTokenizer queryTokenizer = new StringTokenizer(queryCommand, " "); // Using space as the deliminator 

     while(commandTokenizer.hasMoreTokens()) 
     { 
      String queryPart = queryTokenizer.nextToken(); 
      String commandPart = commandTokenizer.nextToken(); 
      if(commandPart.startsWith(queryPart) || queryPart.equals("?")){ 
       matches = true; 
      }else{ 
       matches = false; 
       break; 
      } 
     } 
     if(matches){ 
      matchingCommands.add(command); 
     } 
    } 
    System.out.println(matchingCommands); 

이 프로그램이 동적으로 확장 할 수 있는지 확인하십시오 것 때문에 널 객체의 메모리가 더 낭비 중 하나가 없다 :

이 같은 것입니다.