2012-07-31 1 views
0

Dire que j'ai un tableau de chaînes:Besoin de trier des chaînes par une partie de la chaîne

String[] array = { 
    "2183417234 somerandomtexthere", 
    "1234123656 somemorerandomtexthere", 
    "1093241066 andevenmore", 
    "1243981234 you get what i mean", 
    //etc 

}; 

Comment puis-je régler ce tableau en utilisant la longue (est longue) au début de la chaîne, il « ll finir par ressembler à ceci:

String[] array = { 
    "1093241066 andevenmore", 
    "1234123656 somemorerandomtexthere", 
    "1243981234 you get what i mean", 
    "2183417234 somerandomtexthere", 
    //etc 

}; 

J'ai essayé everyting d'en faire un arraylist et en utilisant des collections # sorte à créer mon propre comparateur, à l'aide d'une carte Sorted/carte des arbres et je ne peux pas comprendre. Merci.

+4

comparateur Déposez votre, afin que nous puissions fixer – dantuch

+1

Vous devriez certainement utiliser un comparateur personnalisé. –

+1

Comparateur à l'intérieur peut être divisé la chaîne et juste comparer les valeurs longues – kosa

Répondre

2

Utilisez cette fonction:

static long comparedValue(String s) { 
    return Long.valueOf(s.substring(0, s.indexOf(' '))); 
} 

puis définir un en termes de Comparator il:

public int compare(String left, String right) { 
    return comparedValue(left) - comparedValue(right); 
} 
+0

Cela ne fonctionnera pas sans une distribution quelque part. En outre, la comparaison en soustrayant des valeurs 'long' peut donner le mauvais résultat en cas de débordement. –

1

En utilisant Google Guava:

List<String> unsorted = Arrays.asList(array); 

Function<String, Long> longFunction = new Function<String, Long>() { 
    @Override public Long apply(String input) { 
    return Long.valueOf(input.split(" ")[0]); 
    } 
}; 

List<String> sorted = Ordering.natural().onResultOf(longFunction).immutableSortedCopy(unsorted); 

ou si vous ne voulez pas utiliser une liste (vous devriez toujours préférer les collections aux tableaux):

Arrays.sort(array, Ordering.natural().onResultOf(longFunction)); 
0

L'entrée que vous avez montrée fonctionne parfaitement. Mais c'est parce que tous ont le même nombre de chiffres.

public static void main(String[] args) { 
    String[] array = { "2183417234 somerandomtexthere", 
      "1234123656 somemorerandomtexthere", "1093241066 andevenmore", 
      "1243981234 you get what i mean", "999 little shorter" 
    // etc 

    }; 

    List<String> list = Arrays.asList(array); 
    Collections.sort(list); 

    System.out.println(list); 
} 

Les problèmes commencent à se produire, lorsque vous utilisez des numéros plus courts - comme indiqué ci-dessus 999 ...

sortie sera:

[1093241066 andevenmore, 1234123656 somemorerandomtexthere, 1243981234 you get what i mean, 2183417234 somerandomtexthere, 999 little shorter]

Donc, pour faire fonctionner AllWays - vous avez besoin de votre comparateur personnalisé, qui sera capable de séparer des chaînes données, puis d'en extraire le nombre et de les comparer. En utilisant la solution @Marko Topolik:

static long comparedValue(String s) { 
    return Long.valueOf(s.substring(0, s.indexOf(' '))); 
} 

public int compare(String left, String right) { 

    long result = comparedValue(left) - comparedValue(right); 

    boolean numberPartAreEqual = result == 0; 
    if (numberPartAreEqual) { 
     result = left.compareTo(right); 
    } 

    return (int) result; 
} 
0

Un comparateur personnalisé devrait fonctionner correctement:

public class LongPrefixComparator implements Comparator<String> { 
    @Override 
    public int compare(String s1, String s2) { 
     final long pref1 = getPrefixValue(s1); 
     final long pref2 = getPrefixValue(s2); 
     return s1 == s2 ? 0 : s1 < s2 ? -1 : 1; 
    } 

    private static long getPrefixValue(String stg) { 
     int len = stg.indexOf(' '); 
     if (len > 0) { 
      try { 
       return Long.parseLong(stg.substring(0, len)); 
      catch (NumberFormatException ignored) {} 
     } 
     return 0L; 
    } 
} 
Questions connexes