2015-12-08 57 views
0

因此,可以說有一個節點,它有三個屬性:pdf:Titledc:title & node name,我想比較和排序基於這些數組優先順序相同的屬性。因此,如果節點1具有全部三個屬性並且節點2僅具有dc:title,則它應該比較節點1的pdf:Title與節點2的dc:title比較(排序)的優先級來比較3個屬性的對象數組列表

這是我使用的代碼:

@Override 
public int compare(Node o1, Node o2) { 


    try { 
     int compareValue; 
     boolean o1HasPdfTitle = o1.hasProperty("jcr:content/metadata/pdf:Title"); 
     boolean o1HasDcTitle = o1.hasProperty("jcr:content/metadata/dc:title"); 
     boolean o2HasPdfTitle = o2.hasProperty("jcr:content/metadata/pdf:Title"); 
     boolean o2HasDcTitle = o2.hasProperty("jcr:content/metadata/dc:title"); 

     if (o1HasPdfTitle && o2HasPdfTitle) {  
      compareValue = o1.getProperty("jcr:content/metadata/pdf:Title").getString().compareTo(o2.getProperty("jcr:content/metadata/pdf:Title").getString()); 
      return compareValue; 
     } else if (o1HasPdfTitle && o2HasDcTitle) {   
      compareValue = o1.getProperty("jcr:content/metadata/pdf:Title").getString().compareTo(o2.getProperty("jcr:content/metadata/dc:title").getString()); 
      return compareValue; 
     } else if (o1HasDcTitle && o2HasPdfTitle) {   
      compareValue = o1.getProperty("jcr:content/metadata/dc:title").getString().compareTo(o2.getProperty("jcr:content/metadata/pdf:Title").getString()); 
      return compareValue; 
     } else if (o1HasDcTitle && o2HasDcTitle) {   
      compareValue = o1.getProperty("jcr:content/metadata/dc:title").getString().compareTo(o2.getProperty("jcr:content/metadata/dc:title").getString()); 
      return compareValue; 
     } else if (!o1HasPdfTitle && !o1HasDcTitle && o2HasPdfTitle){ 
      compareValue = o1.getName().compareTo(o2.getProperty("jcr:content/metadata/pdf:Title").getString()); 
      return compareValue; 
     } else if (!o1HasPdfTitle && !o1HasDcTitle && o2HasDcTitle){ 
      compareValue = o1.getName().compareTo(o2.getProperty("jcr:content/metadata/dc:title").getString()); 
      return compareValue; 
     } else if (o1HasPdfTitle && !o2HasPdfTitle && !o2HasDcTitle){ 
      compareValue = o1.getProperty("jcr:content/metadata/pdf:Title").getString().compareTo(o2.getName()); 
      return compareValue; 
     } else if (o1HasDcTitle && !o2HasPdfTitle && !o2HasDcTitle){ 
      compareValue = o1.getProperty("jcr:content/metadata/dc:title").getString().compareTo(o2.getName()); 
      return compareValue; 
     } else { 
      compareValue = o1.getName().compareTo(o2.getName()); 
      return compareValue; 
     } 

    } catch (Exception e) { 
      LOGGER.debug("CustomComparatorTitle debug message" + e); 
      return 0; 
    } 

問題:它不排序正確,他們不是按字母順序排列。我錯過了什麼嗎?

還有沒有更好的方式來賴代碼而不使用這麼多的條件?我試圖避免IllegalArgumentException: Comparison method violates its general contract!

回答

1

我不知道我理解你的代碼,但它似乎在這一方式更好:

final String pPdf="jcr:content/metadata/pdf:Title"; 
    final String pDC="jcr:content/metadata/dc:title"; 

    String[] values=new String[2]; 
    for (int i = 0; i < values.length; i++) 
    { 
     Node curNode=i==0?o1:o2; 

     if(curNode.hasProperty(pPdf)) 
      values[i]=curNode.getProperty(pPdf).getString(); 
     else if(curNode.hasProperty(pDC)) 
      values[i]=curNode.getProperty(pDC).getString(); 
     else 
      values[i]=curNode.getName(); 
    } 
    return values[0].compareTo(values[1]); 

這不是更好嗎?