2015-12-08 1 views
0

permet donc dire qu'il ya un noeud, et il a trois propriétés: pdf:Title, dc:title & node name, je voudrais comparer et trier le tableau en fonction de ces propriétés avec priorité dans le même ordre. Donc, si node1 a les trois propriétés et node2 a seulement dc:title, il doit comparer pdf:Title de node1 avec dc:title de node2.Comparator (tri) pour comparer la liste de tableau d'objets avec 3 propriétés par priorité

C'est le code que je utilise:

@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; 
    } 

Problème: Il ne trie pas correctement, ils ne sont pas classés par ordre alphabétique. Est-ce que je manque quelque chose?

Existe-t-il une meilleure façon d'écrire le code sans utiliser autant de conditions? Je tentais d'éviter la IllegalArgumentException: Comparison method violates its general contract!

Répondre

1

je ne suis pas sûr que je comprends votre code, mais il est semble son mieux de cette façon:

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]); 

ce n'est pas mieux?