2014-03-28 89 views
0

我有很難寫出比較排序與下列字符串字段的自定義對象的名單列表: 1.科類 - >可以是州,縣或郵政編碼並用於識別哪個數據字段是它;不能爲空 2.狀態 - >國家名稱,不能爲空 3.地理 - >如果分支class.equals'county」,將持有的縣名,可以是空 4.拉鍊 - >郵政編碼。可以爲州和縣爲空 5. ParentNodeId - >應該適用於此樹的父級的名稱。例如,一個州有沒有父(空字符串),而該縣的狀態爲parentNodeId,並且該zipCode具有縣作爲parentNodeId。因此,對於branch =「state」,zipCode「36003」的地理對象,parentNodeId應該是Autauga,狀態是「AL」。對於分支=「縣」和地理=「Autauga」的地理對象,則parentNodeId爲「AL」。自定義比較排序州,縣和郵政編碼

當前對象列表的形式是:狀態 - 態 - 態 - 縣 - 縣 - 郵編 - 郵政編碼

雖然我期待有

-state

列表

- 縣

- 郵編

- 郵編

- 縣

- 郵編

-State

- 縣

等。

我的審判仍然缺少我不知道的情況下。這是我的代碼

public static final Comparator<Geography> BY_STATE_COUNTY_ZIP_COMPARATOR = new Comparator<Geography>() { 

public int compare(final Geography obj1, final Geography obj2) { 

    if (obj1.getZip().equals("89420") || obj2.getZip().equals("89420") || obj1.getGeography().equals("Mono") 
      || obj2.getGeography().equals("Mono")) { 
     System.out.println("hdfhd"); 
    } 

    if (obj1.getBranchClass().equalsIgnoreCase(obj2.getBranchClass())) { 
     return this.similarBranchComparison(obj1, obj2); 
    } 
    else { 
     // Different branches 
     final int x = this.differentBranchesComparison(obj1, obj2); 
     return x; 
    } 

} 

private int differentBranchesComparison(final Geography obj1, 
     final Geography obj2) { 

    if ((obj1.getZip().equals("89420") && obj1.getParentNodeId().equals("Mono")) 
      || ((obj2.getZip().equals("89420") && obj2.getParentNodeId().equals("Mono")))) { 
     System.out.println("hdfhd"); 
    } 

    // Same states - Obj1 is state 
    if (obj1.getBranchClass().equalsIgnoreCase(ASDGeographyBasedDashboardVO.STATE_LEVEL) 
      && obj1.getState().equalsIgnoreCase(obj2.getState())) { 
     // obj2 should be greater 
     return -1; 
    } 
    // Same states - Obj2 is state 
    else if (obj2.getBranchClass().equalsIgnoreCase(ASDGeographyBasedDashboardVO.STATE_LEVEL) 
      && obj1.getState().equalsIgnoreCase(obj2.getState())) { 
     // obj1 should be greater 
     return 1; 
    } 
    // Different states - obj1 OR Obj2 is state 
    else if (((obj1.getBranchClass().equalsIgnoreCase(ASDGeographyBasedDashboardVO.STATE_LEVEL)) || (obj2 
      .getBranchClass().equalsIgnoreCase(ASDGeographyBasedDashboardVO.STATE_LEVEL))) 
      && !(obj1.getState().equalsIgnoreCase(obj2.getState()))) { 
     // Delegate to state comparison 
     return new CompareToBuilder().append(obj1.getState(), obj2.getState()).toComparison(); 
    } 
    // Same states - Same counties (County - Zip) 
    else if (obj1.getBranchClass().equalsIgnoreCase(ASDGeographyBasedDashboardVO.COUNTY_LEVEL) 
      && ((obj1.getState().equalsIgnoreCase(obj2.getState())) && (obj1.getGeography() 
        .equalsIgnoreCase(obj2.getParentNodeId())))) { 
     // obj2 (zip) should be greater 
     return -1; 
    } 
    // Same states - Same counties (Zip - County) 
    else if (obj2.getBranchClass().equalsIgnoreCase(ASDGeographyBasedDashboardVO.COUNTY_LEVEL) 
      && ((obj1.getState().equalsIgnoreCase(obj2.getState())) && (obj1.getParentNodeId() 
        .equalsIgnoreCase(obj2.getGeography())))) { 
     // obj1 should be greater 
     return 1; 
    } 
    // Same states different counties (County - zip) 
    else if ((obj1.getBranchClass().equalsIgnoreCase(ASDGeographyBasedDashboardVO.COUNTY_LEVEL)) 
      && (obj1.getState().equalsIgnoreCase(obj2.getState()) && !(obj1.getGeography() 
        .equalsIgnoreCase(obj2.getParentNodeId())))) { 
     return new CompareToBuilder().append(obj1.getGeography(), obj2.getParentNodeId()).toComparison(); 
    } 

    // Same states different counties (Zip - County) 
    else if ((obj2.getBranchClass().equalsIgnoreCase(ASDGeographyBasedDashboardVO.COUNTY_LEVEL)) 
      && (obj1.getState().equalsIgnoreCase(obj2.getState()) && !(obj1.getParentNodeId() 
        .equalsIgnoreCase(obj2.getGeography())))) { 
     return new CompareToBuilder().append(obj1.getParentNodeId(), obj2.getGeography()).toComparison(); 
    } 

    // Different States 
    else if (((obj1.getBranchClass().equalsIgnoreCase(ASDGeographyBasedDashboardVO.COUNTY_LEVEL)) || (obj2 
      .getBranchClass().equalsIgnoreCase(ASDGeographyBasedDashboardVO.COUNTY_LEVEL))) 
      && !(obj1.getState().equalsIgnoreCase(obj2.getState()))) { 
     return new CompareToBuilder().append(obj1.getState(), obj2.getState()).toComparison(); 
    } 
    return 0; 

} 

private int similarBranchComparison(final Geography obj1, 
     final Geography obj2) { 
    // State-State, County - County, Zip-Zip 
    // State-State 
    if (obj1.getBranchClass().equalsIgnoreCase(ASDGeographyBasedDashboardVO.STATE_LEVEL)) { 
     return new CompareToBuilder().append(obj1.getState(), obj2.getState()).toComparison(); 
    } 
    // County - County 
    else if (obj1.getBranchClass().equalsIgnoreCase(ASDGeographyBasedDashboardVO.COUNTY_LEVEL)) { 
     if (obj1.getState().equalsIgnoreCase(obj2.getState())) { 
      // Compare Counties within the same state 
      return new CompareToBuilder().append(obj1.getGeography(), obj2.getGeography()).toComparison(); 
     } 
     else { 
      // Compare Counties within different states 
      return new CompareToBuilder().append(obj1.getState(), obj2.getState()).toComparison(); 
     } 
    } 
    else { 
     // Zip - Zip 
     if (obj1.getState().equalsIgnoreCase(obj2.getState())) { 
      if (obj1.getParentNodeId().equalsIgnoreCase(obj2.getParentNodeId())) { 
       return new CompareToBuilder().append(obj1.getZip(), obj2.getZip()).toComparison(); 
      } 
      else { 
       return new CompareToBuilder().append(obj1.getParentNodeId(), obj2.getParentNodeId()) 
         .toComparison(); 
      } 
     } 
     else { 
      // Compare Zip codes within different states 
      return new CompareToBuilder().append(obj1.getState(), obj2.getState()).toComparison(); 
     } 

    } 
} 
}; 
+0

檢查新Java8功能流和過濾涼方法,減少,等我可以檢查你的要求和撰寫明天的東西,但不是今晚:-( – Lukino

+0

不幸的是,我僅限於Java 1.6的 –

+0

然後結帳從谷歌番石榴庫。很少有這些功能了。FluentIterable,可選等。 – Lukino

回答

1

這應該是一個簡單的比較器,首先比較狀態,然後是縣,然後zip。因此,假設您可以編寫getState(),getCounty()和getZip()方法,並且可以爲狀態,縣和zip編寫比較。如果你不能從所有不同的類型中獲得狀態,那麼你就無法比較它們。

下面是一些僞代碼。

Comparator<Geography> comparator = new Comparator<>() { 
    public int compare(final Geography obj1, final Geography obj2) { 
     state1 = getState(obj1); 
     state2 = getState(obj2); 

     int retCode = state1.compare(state2); 
     if (retCode != 0) 
      return retCode; 

     county1 = getCounty(obj1); 
     county2 = getCounty(obj2); 

     retCode = county1.compare(county2); 
     if(retCode != 0) 
      return retCode; 

     zip1 = getZip(obj1); 
     zip2 = getZip(obj2); 

     retCode = zip1.compare(zip2); 
     return retCode; 
    } 
} 
+0

你認爲它包括了你比較郵編和縣的情況嗎?或者你比較了兩個不同狀態的縣,或者當你比較兩個縣時郵政編碼,但在一個州的不同縣? 一個問題,我有是縣不可用,如果地理對象表示郵政編碼 –

+0

好了,如果沒有縣你不能比較縣。所以你要求的這個順序是不可能的,除非你可以將zip文件映射到某個縣。您可能可以使用類似http://www.zipwise.com/webservices/的幫助來解決這個問題。 – Zagrev

+0

它爲我工作。謝謝! –

相關問題