2017-08-27 1 views
0

Hallo Ich versuche, Versionsnummern von Telefongeräten zu vergleichen. Mein Programm stürzt ab, wenn eine Version als 4.3.2 kommt, also habe ich das Dezimalformat implementiert, aber jetzt wird nur noch meine Nummer von 4.3.2 auf 4.3 gerundet, aber das Programm wird mit einer Versionsnummer von zB 4.2 völlig in Ordnung sein . Wie kann ich meinen Vergleicher reparieren, um 3 Dezimalstellen aufzunehmen und nicht zu stürzen, während ich noch für 2 Dezimalstellen arbeite?Version Komparator 3 Dezimalstellen

 @Override 
     public int compare(InventoryCardViewModel lhs, InventoryCardViewModel rhs) { 

      Phone lhp = phoneDataSource.getPhoneByDeviceID(lhs.getPhoneDeviceID.getValue()); 
      Phone rhp = phoneDataSource.getPhoneByDeviceID(rhs.getPhoneDeviceID.getValue()); 

      if(!lhp.versionNumber.equals(rhp.versionNumber)) { 
       DecimalFormat df = new DecimalFormat("#.#.#", new DecimalFormatSymbols(new Locale("en_US"))); 
       try { 
        lhp.versionNumber = String.valueOf(df.parse(lhp.versionNumber).doubleValue()); 
        rhp.versionNumber = String.valueOf(df.parse(lhp.versionNumber).doubleValue()); 
       } catch (ParseException e) { 
        e.printStackTrace(); 
       } 
       if (Double.valueOf(lhp.versionNumber) > Double.valueOf(rhp.versionNumber)) { 
        return -1; 
       } else { 
        return 1; 
       } 
+0

Verwenden Sie kein 'DecimalFormat'; Ich würde wahrscheinlich auf '' \\. '' Teilen und die resultierenden Token vergleichen. –

Antwort

0

Wie ich in den Kommentaren erwähnt, können Sie keine DecimalFormat hier verwenden, da die Java Dezimaltypen nicht beliebige Anzahl von Dezimalstellen unterstützen (noch sind die primitiven Typen der Lage beliebiger Genauigkeit). Stattdessen würde ich auf eine \\. teilen und dann Iteration verwenden, um die resultierenden Token zu testen. Etwas wie,

public class VersionComparator implements Comparator<String> { 
    @Override 
    public int compare(String left, String right) { 
     /* Handle nulls. */ 
     if (left == null) { 
      if (right == null) { 
       return 0; 
      } 
      return -1; 
     } else if (right == null) { 
      return 1; 
     } 
     /* Generate tokens */ 
     String[] lTokens = left.split("\\."); 
     String[] rTokens = right.split("\\."); 

     int len = Math.max(lTokens.length, rTokens.length); 
     for (int i = 0; i < len; i++) { 
      /* Check if both sides still have tokens */ 
      if (i < lTokens.length && i < rTokens.length) { 
       int a = Integer.parseInt(lTokens[i]); 
       int b = Integer.parseInt(rTokens[i]); 

       if (a < b) { 
        return -1; 
       } else if (a > b) { 
        return 1; 
       } 
      } else if (i < rTokens.length) { 
       /* No more tokens on the left hand side */ 
       return -1; 
      } else { 
       /* No more tokens on the right hand side */ 
       return 1; 
      } 
     } 
     return 0; 
    } 
} 
0
int compareVersions(String v1, String v2) { 
    final String[] split1 = v1.split("[.]"); 
    final String[] split2 = v2.split("[.]"); 

    for (int i = 0; i < split1.length; i++) { 
     if (i < split2.length) { 
      final int compare = Integer.valueOf(split1[ i ]) 
             .compareTo(Integer.valueOf(split2[ i ])); 

      if (compare != 0) { 
       return compare; 
      } 
     } 
     else { 
      return 1; 
     } 
    } 

    return split1.length == split2.length ? 0 : -1; 
}