2014-10-18 83 views
0

所以,我試圖做一個函數,它將訪問一個頁面,獲取一個項目的ID和TYPE,然後訪問一個鏈接並插入ID和TYPE以獲得ITEM NAME 。然後它會將所有這些添加到ArrayList中。新列表(id,type,name);Java正則表達式,帶變量的多表達式

public static ArrayList<Kad> getDetails(final String strHTML, final String strHTML2) { 
    final ArrayList<Kad> kads = new ArrayList<Kad>(); 
    try { 
     final Pattern regex = Pattern 
       .compile(
         "id=(\\d+)\\&tab=([a-zA-Z]+)", 
         Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); 
     final Pattern regex2 = Pattern 
       .compile(
         "font-weight:bold; font-size:11px;\">([\\w\\s]+)</div>", 
         Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); 

     final Matcher regexMatcher = regex.matcher(strHTML); 
     final Matcher regexMatcher2 = regex2.matcher(strHTML2); 

     String ids = ""; 
     while (regexMatcher.find() && regexMatcher2.find()) { 
      final int id = Integer.parseInt(regexMatcher.group(1)); 
      final String tab = regexMatcher.group(2); 
      final String name = regexMatcher2.group(1); 


      if (!ids.contains(id + "|") && !ignoreList.contains(id)) { 
       kads.add(new Kad(id,tab,name)); 
       ids += id + "|"; 
      } 
     } 
     return kads; 
    } catch (final Exception ex) { 
     ex.printStackTrace(); 
    } 
    return new ArrayList<Kad>(); 
} 

此代碼用於獲取項目的ID,類型和名稱。但是,由於此函數獲取ID和名稱,我無法獲取ID列表。將其分解爲兩個函數(其中一個獲得ID和TYPE),然後另一個獲取名稱的最佳方法是什麼?

此方法使用名爲:

data = wrapper.post("LINK1", "tab=" + "food" + "&page=" + "1", ""); 
     data2 = wrapper.post("LINK2", "tab=" + "CURRENT ITEM TYPE IN LIST GOES HERE" + "&id=" + "CURRENT ITEM ID IN LIST GOES HERE", ""); 
     final ArrayList<Kad> kadList = Kad.getDetails(data, data2); 

我試圖打破它分成兩個不同的方法,但無法弄清楚如何在方法2中找到的名稱添加到ID的已創建的列表和TYPE在方法1中。

編輯:好的,所以在下面的建議解決方案後,我現在可以在兩個獨立的方法中獲取id和名稱。現在的問題是方法2(獲取名稱方法)是給每個單一的ID相同的名稱(搜索的第一個名稱)。我如何解決這個問題?

public static ArrayList<Kad> findItemName2(final int id, final String tab, final String strHTML) { 
    final ArrayList<Kad> names = new ArrayList<Kad>(); 
    try { 
     final Pattern regex = Pattern 
       .compile(
         "font-weight:bold; font-size:11px;\">([\\w\\s]+)</div>", 
         Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); 
     final Matcher regexMatcher = regex.matcher(strHTML); 
     String ids = ""; 
     while (regexMatcher.find()) { 

      final String name2 = regexMatcher.group(1); 

      if (!ids.contains(name2 + "|")) { 
       names.add(new Kad(id,tab, name2)); 
       name = name2; 
       ids += name2 + "|"; 
      } 
     } 
     return names; 
    } catch (final Exception ex) { 
     ex.printStackTrace(); 
    } 
    return new ArrayList<Kad>(); 
} 

回答

1

你可以試試下面

  • 創建2種不同的方法 - method1method2 - 一個意願,抓住idtype和另一意願name
  • 將存在於現有getDetails方法中的代碼分離並將其移入這些方法中。
  • id,typename創建類別爲Kad類的獲得者和設置者。
  • 創建Kad類的實例,並調用它method1method2和調用這些method1 & method2內各自制定者,爲這些字段中的值。

一次,method1method2執行 - 你有idtypename值設置成可使用的getter通過以下三種不同的領域。

+0

所以,你讓我一直到第4步。「在這些方法1和方法2裏面」是我不理解的一點。 – user1508174 2014-10-18 06:56:20

+0

此外,我很困惑我將如何拉出ArrayList中的特定「Kad」來追加名稱?相當多的方法1將獲得所有的ID和類型,並將它們投入ArrayList,它將輸出如下所示的內容:{9:food,10:food,11:food},我需要運行method2來追加(for例如ID 9)它在ArrayList中的條目名稱,因此它讀取:{9:food:NAME} – user1508174 2014-10-18 07:13:53

+0

嘗試在方法一和方法二中的兩個列表中組裝數據。一個'id'和'type'的列表,另外一個'name'。一旦你有這些列表,然後從這些列表中讀取數據,以創建'Kads'對象並準備'kads' arraylist。 – Tirath 2014-10-18 07:52:41