2013-10-14 51 views
-1

已解決。答案是更換String.contains與ArrayList行爲異常

for (int i = 0; i < results.size(); i++) 
    { 
     lowerField = results.get(i)[2].toLowerCase(); 

     if(lowerField.equals(search)); 
     { 
      finalResults.add(results.get(i)); 
     } 
    } 

  for(String[] searchItems : results) 
      { 
       lowerField = searchItems[2].toLowerCase(); 
       if(lowerField.equals(search)) 
       { // or lowerField.contains(search) 
        finalResults.add(searchItems); 
       } 
      } 

看來,出於某種原因,原始添加(results.get(I))語句的某處混亂的東西,而加(searchItems)聲明很好地播放。

爲了幫助其他人有類似的問題,請幫我清理和澄清這個問題,以適當的標準,因此它可以幫助別人。再次感謝您的幫助

public static ArrayList<String[]> searchLog(ArrayList<String> searchMe, String action) 
{ 
    //ArrayList full of String arrays to break up and hold each line of the passed ArrayList 
    ArrayList<String[]> results = new ArrayList<String[]>(); 
    //Same structure as above, intended to hold the lines matching the user's search criteria 
    ArrayList<String[]> finalResults = new ArrayList<String[]>(); 
    //String variable used to hold the current field we're searching "toLowerCase" 
    String lowerField = null; 

    //For each string in the input ArrayList... 
    for (String str : searchMe) 
    { 
     //Add each line (after splitting it into an array) to the "results" ArrayList 
     results.add(str.split("~")); 
    } 

    //If the user chose to search on "Partner ID" 
    if (action.equals("ptnr")) 
    { 
     //Print line with criteria and search field 
     System.out.println("Searching on Partner ID for " + search + "...."); 

     //For each line (string array) in the "results" ArrayList 
     for(String[] searchItems : results) 
     { 
      //Set "lowerField" equal to the current line (string array) sub 1 where Partner ID is located, and set it toLowerCase 
      lowerField = searchItems[1].toLowerCase(); 
      //If the cell we're searching contains the user's search criteria 
      if(lowerField.contains(search)) 
      { 
       //Then add the whole line to the finalResults ArrayList that we will return from this function. 
       finalResults.add(searchItems); 
      } 
     } 
    } 
    return finalResults; 
} 

感謝:

正確的工作代碼在原來的問題速配樣本!

~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~找到匹配項後,該函數將整個數組添加到第二個ArrayList中,其中包含搜索結果。

我還試圖簡單地移除任何沒有從原始的ArrayList與搜索標準匹配,以節省不必要地具有的第二個的所述存儲器並取得相同的不正確的結果這種方式爲好。功能如下:

注意:在用於此處之前,SEARCH是一段用戶輸入(存儲在公共靜態「全局」中),已經在我的Main函數中設置爲「toLowerCase」。

public static ArrayList<String[]> searchLog(ArrayList<String> searchMe, String action) 
{ 
    ArrayList<String[]> results = new ArrayList<String[]>(); 
    ArrayList<String[]> finalResults = new ArrayList<String[]>(); 

    String lowerField = null; 

    for (String str : searchMe) 
    { 
     results.add(str.split("~")); 
    } 

    if (action.equals("ptnr")) 
    { 
     System.out.println("Searching on Partner ID for " + search + "...."); 
     for (int i = 0; i < results.size()-1; i++) 
     { 
      lowerField = results.get(i)[1].toLowerCase(); 

      if(lowerField.equals(search)) 
      { 
       //System.out.println("one added"); 
       finalResults.add(results.get(i)); 
      } 
     } 
    } 

    return finalResults; 
} 

我使用lowerField.equals(搜索),lowerField.contains(搜索),並且lowerField.matches(搜索),以包括若干變型和字符串操作它們的嘗試。

我理想的結果是使用「載,」作爲「時間戳」,用戶可以搜索是不切實際的具體包含的不僅僅是一個日期和時間,他們可以現實上搜索更多信息。

現在爲我的結果。

當我運行的功能和搜索「PTNR,」我的結果是正確的。當我搜索其他兩個時,我的結果會返回正確的NUMBER個條目(當我有一個println指示一個不匹配的條目已被刪除時,包括正確的REMOVED數量),但是保留的條目並展示了不匹配的線以及匹配在一起的混合包。同樣,打印輸出的NUMBER行是正確的,但行本身不僅僅是匹配行。

這是調用searchLog()函數:

if(srv) 
     { 
      System.out.println(""); 
      System.out.println("============================= SEARCH RESULTS ==================================="); 
      System.out.println(""); 

      ArrayList<String[]> results = searchLog(line, "ptnr"); 

      for (int x = 0; x < results.size(); x++) 
       System.out.println(results.get(x)[0] + " " + results.get(x)[1] + " " + results.get(x)[2] + " " + results.get(x)[3] + " " + results.get(x)[4] + " ms."); 

      System.out.println(""); 
      System.out.println("============================= END SEARCH RESULTS ==================================="); 
      System.out.println(""); 
     } 

以上,「線」是我通過搜索ArrayList和「SRV」的「如果」塊是一個全球性的布爾集通過用戶輸入。所有這些目前都在工作,而不是搜索和過濾。

在此先感謝你們,讓我知道如果你需要任何更多的信息!

編輯:是的,我知道我用了一個冒泡排序...讓火焰開始哈哈,但它已經有一段時間了,這是一個時間敏感的新工作。在運行這個util的服務器上,在處理的數據量最小(每次運行300行)的情況下,泡泡在遊標閃爍時仍然能夠實現其目標。 :)

編輯2:樣品輸入數據:

2013-10-15 08:28:31,514~stQAEFV~establishAgreementSummary~2~5234 ms. 
2013-10-15 08:28:22,442~sgFASTOL~retrieveParty~2~1776 ms. 
2013-10-15 08:27:37,333~sfRPDesktop~modifyParty~2~1744 ms. 
2013-10-15 08:28:14,719~sgITL~retrieveParty~2~1702 ms. 
2013-10-15 08:28:27,755~sgFASTOL~establishParty~2~1682 ms. 
2013-10-15 08:28:39,677~sfRPDesktop~retrieveParty~2~1679 ms. 
2013-10-15 08:27:55,768~sgBLD~searchAgreementSummary~2~1495 ms. 
2013-10-15 08:27:46,272~sgCSCWB~searchAgreementSummary~1~1402 ms. 
2013-10-15 08:27:49,660~sfRPDesktop~retrieveParty~2~1395 ms. 
2013-10-15 08:27:39,547~sgHERYN~searchAgreementSummary~1~1341 ms. 
2013-10-15 08:27:47,028~sgCSCWB~retrieveCustomerProfile~1~1323 ms. 
2013-10-15 08:27:29,795~sgFASTOL~retrieveParty~2~1296 ms. 
2013-10-15 08:27:44,520~sfRPDesktop~retrieveParty~2~1290 ms. 
2013-10-15 08:28:04,398~sgFASTOL~retrieveParty~2~1284 ms. 

輸出時的「PTNR」搜尋工作正常,則「Y」(其不應當永遠產生結果時間戳搜索時輸出.. 。)返回所有行:

============================= SEARCH RESULTS =================================== 

Searching on Partner ID for sgfastol.... 
before sort 
after sort 
2013-10-15 08:28:22,442 sgFASTOL retrieveParty 2 1776 ms. 
2013-10-15 08:28:27,755 sgFASTOL establishParty 2 1682 ms. 
2013-10-15 08:27:29,795 sgFASTOL retrieveParty 2 1296 ms. 
2013-10-15 08:28:04,398 sgFASTOL retrieveParty 2 1284 ms. 





============================= SEARCH RESULTS =================================== 

Searching on Timestamp for y.... 
before sort 
after sort 
2013-10-15 08:28:31,514 stQAEFV establishAgreementSummary 2 5234 ms. 
2013-10-15 08:28:22,442 sgFASTOL retrieveParty 2 1776 ms. 
2013-10-15 08:27:37,333 sfRPDesktop modifyParty 2 1744 ms. 
2013-10-15 08:28:14,719 sgITL retrieveParty 2 1702 ms. 
2013-10-15 08:28:27,755 sgFASTOL establishParty 2 1682 ms. 
2013-10-15 08:28:39,677 sfRPDesktop retrieveParty 2 1679 ms. 
2013-10-15 08:27:55,768 sgBLD searchAgreementSummary 2 1495 ms. 
2013-10-15 08:27:46,272 sgCSCWB searchAgreementSummary 1 1402 ms. 
2013-10-15 08:27:49,660 sfRPDesktop retrieveParty 2 1395 ms. 
2013-10-15 08:27:39,547 sgHERYN searchAgreementSummary 1 1341 ms. 
2013-10-15 08:27:47,028 sgCSCWB retrieveCustomerProfile 1 1323 ms. 
2013-10-15 08:27:29,795 sgFASTOL retrieveParty 2 1296 ms. 
2013-10-15 08:27:44,520 sfRPDesktop retrieveParty 2 1290 ms. 
2013-10-15 08:28:04,398 sgFASTOL retrieveParty 2 1284 ms. 

最後,我知道它是馬虎。我道歉。我實際上已經投入了三個小時,其中一個試圖找出這個搜索。這是一個用Java編寫的unix util(對unix不太熟悉)(我是一個.NET開發人員),所以我略微超出了我的元素。清理工作一旦發揮作用就會發生。如果你願意,這只是一個「粗略草案」,只是爲了顯示一個大型項目的可行性(或缺乏)。儘管謝謝你的迴應!每個答案的具體評論。

-Tom

+0

你已經表現出了很大的代碼,但它並不完全清楚這一切是相關的。爲什麼在迭代時忽略'finalResults'和'results'的最後一個元素? (你的for循環的形式是for(int i = 0; i

+0

將searchLog方法中的實際輸入值以及預期結果和實際結果的示例非常有用。如果您可以提供輸入和搜索字符串的完整示例,我們可以幫您解決這個問題。 – axiopisty

+0

@JonSkeet修復了迭代器,不知道我在那裏做了什麼。不影響我的搜索結果。 – roflplanes

回答

0

即使在對OP做出的兩個編輯之後,仍然不清楚預期和實際結果是什麼。也不清楚問題是什麼。回答一個不清楚,沒有問題的問題是非常困難的。但基於示例代碼,這是一個示例測試程序,可能會讓您更接近您要查找的內容...也許?

import java.util.*; 

public class Question19369420 { 
    private static String search; 

    public static void main(String[] args) { 

     search = "sgfastol"; 

     List<String> input = new ArrayList<>(); 
     input.add("2013-10-15 08:28:31,514~stQAEFV~establishAgreementSummary~2~5234 ms."); 
     input.add("2013-10-15 08:28:22,442~sgFASTOL~retrieveParty~2~1776 ms."); 
     input.add("2013-10-15 08:27:37,333~sfRPDesktop~modifyParty~2~1744 ms."); 
     input.add("2013-10-15 08:28:14,719~sgITL~retrieveParty~2~1702 ms."); 
     input.add("2013-10-15 08:28:27,755~sgFASTOL~establishParty~2~1682 ms."); 
     input.add("2013-10-15 08:28:39,677~sfRPDesktop~retrieveParty~2~1679 ms."); 
     input.add("2013-10-15 08:27:55,768~sgBLD~searchAgreementSummary~2~1495 ms."); 
     input.add("2013-10-15 08:27:46,272~sgCSCWB~searchAgreementSummary~1~1402 ms."); 
     input.add("2013-10-15 08:27:49,660~sfRPDesktop~retrieveParty~2~1395 ms."); 
     input.add("2013-10-15 08:27:39,547~sgHERYN~searchAgreementSummary~1~1341 ms."); 
     input.add("2013-10-15 08:27:47,028~sgCSCWB~retrieveCustomerProfile~1~1323 ms."); 
     input.add("2013-10-15 08:27:29,795~sgFASTOL~retrieveParty~2~1296 ms."); 
     input.add("2013-10-15 08:27:44,520~sfRPDesktop~retrieveParty~2~1290 ms."); 
     input.add("2013-10-15 08:28:04,398~sgFASTOL~retrieveParty~2~1284 ms."); 

     String action = "ptnr"; 
     ArrayList<String[]> results = null; 
     if ("time".equals(action)) { 
      results = searchLogs(input, 0); 
     } else if ("ptnr".equals(action)) { 
      results = searchLogs(input, 1); 
     } else if ("srv".equals(action)) { 
      results = searchLogs(input, 2); 
     } 

     if (results != null) { 
      System.out.println("before sort"); 
      print(results); 
      Collections.sort(results, createComparator(4)); 
      System.out.println("after sort"); 
      print(results); 
     } 

    } 

    public static Comparator<String[]> createComparator(final int field) { 
     return new Comparator<String[]>() { 
      @Override 
      public int compare(String[] a, String[] b) { 
       return a[field].compareTo(b[field]); 
      } 
     }; 
    } 

    public static void print(List<String[]> list) { 
     for (String[] item : list) { 
      System.out.println(String.format(" %s %s %s %s %s ms.", item[0], item[1], item[2], item[3], item[4])); 
     } 
    } 

    public static ArrayList<String[]> searchLogs(List<String> input, int index) { 
     System.out.println("Searching on Partner ID for " + search + "...."); 
     ArrayList<String[]> results = new ArrayList<>(); 
     for (String str : input) { 
      results.add(str.split("~")); 
     } 
     ArrayList<String[]> finalResults = new ArrayList<>(); 
     for (String[] searchItems : results) { 
      String lowerField = searchItems[index].toLowerCase(); 
      if (lowerField.equals(search)) { // or lowerField.contains(search) 
       finalResults.add(searchItems); 
      } 
     } 
     return finalResults; 
    } 
} 

以下是運行該程序的輸出:

Searching on Partner ID for sgfastol.... 
before sort 
    2013-10-15 08:28:22,442 sgFASTOL retrieveParty 2 1776 ms. ms. 
    2013-10-15 08:28:27,755 sgFASTOL establishParty 2 1682 ms. ms. 
    2013-10-15 08:27:29,795 sgFASTOL retrieveParty 2 1296 ms. ms. 
    2013-10-15 08:28:04,398 sgFASTOL retrieveParty 2 1284 ms. ms. 
after sort 
    2013-10-15 08:28:04,398 sgFASTOL retrieveParty 2 1284 ms. ms. 
    2013-10-15 08:27:29,795 sgFASTOL retrieveParty 2 1296 ms. ms. 
    2013-10-15 08:28:27,755 sgFASTOL establishParty 2 1682 ms. ms. 
    2013-10-15 08:28:22,442 sgFASTOL retrieveParty 2 1776 ms. ms. 
+0

我只是嘗試了你的代碼,通過「結果」中的每個「searchItem」迭代,它的工作方式就像一個魅力......我不知道爲什麼這會產生變化,但它確實!感謝您的幫助和指點,我正在按照您現在的建議進行並簡化功能。 :D – roflplanes

+0

在我的第二次編輯中,「正確的」響應是僅返回符合搜索條件的數據。實際的迴應是所有數據都是由於某種原因返回的。正如我上面的評論所述,它最終只是一個簡單的修復。關於我的「迭代,比較,加入,如果相等」塊不起作用,而你的塊做了。編輯我的原始帖子以顯示正常運行的代碼。 – roflplanes

+0

這是一個非問題。這只不過是一種奢侈,對我所遇到的問題沒有任何影響。我對這種混淆表示歉意,並將其從我的問題中的原始代碼(和工作代碼)中刪除。請參閱原始文章的清理,評論,工作代碼,以清除任何我想要完成的混淆。謝謝。 – roflplanes

0

,首先你應該使用像java.util.List代替ArrayList接口,使您的應用更靈活。您的文本表明您正在使用某種時間戳,爲什麼您不使用java.util.Date或與時間有關的某些其他對象?

爲什麼你只是循環爲results.size()-1?這會導致一些results.size()-2運行。設置循環結束的正確方法是i < result.size()i <= result.size()-1

你能爲你的bug提供一些輸入和輸出的例子嗎?

+0

請參閱我的編輯輸入和輸出示例。 至於列表和日期建議,責怪我的新手。我很久沒有碰到過Java,這是我第一次涉足該語言。我會考慮使用List,因爲我甚至都沒有意識到功能上的差異,說實話。 日期是不實際的,因爲我正在處理的日期字段還擁有一個唯一的進程ID,該進程ID綁定到我不想單獨處理的日期(不是唯一的,除了每個時間戳)。 也不想爲每種不同格式的日誌風格設置不同的簡單格式。 – roflplanes