J'essaie de trier une simple liste d'objets par un long terme - le texte ci-dessous ne fonctionne pas car l'une des chaînes longues est poussée au début simplement parce qu'elle commence par un nombre inférieur. Je cherche donc un moyen de les trier directement en fonction des valeurs longues
L'implémentation actuelle d'obj ressemble à celle ci-dessous. Dans la classe que j'utilise, j'appelle Collections.sort (arbres);
public class Tree implements Comparable<Tree> {
public String dist; //value is actually Long
public int compareTo(Tree o) {
return this.dist.compareTo(o.dist);
}
}
pourquoi ne pas réellement stocker un long là-bas:
public class Tree implements Comparable<Tree> {
public long dist; //value is actually Long
public int compareTo(Tree o) {
return this.dist<o.dist?-1:
this.dist>o.dist?1:0;
}
}
ou comparez d’abord la longueur des cordes puis comparez-les
public String dist; //value is actually Long
public int compareTo(Tree o) {
if(this.dist.length()!=o.dist.length())
return this.dist.length()<o.dist.length()?-1:1;//assume the shorter string is a smaller value
else return this.dist.compareTo(o.dist);
}
Si vous souhaitez trier un objet sur une valeur longue et qu'il implémente Comparable, en Java 7+, vous pouvez utiliser Long.compare(long x, long y)
(qui renvoie un int ).
Par exemple.
public class MyObject implements Comparable<MyObject>
{
public long id;
@Override
public int compareTo(MyObject obj) {
return Long.compare(this.id, obj.id);
}
}
Appelez Collections.sort(my_objects)
où my_objects est quelque chose comme
List<MyObject> my_objects = new ArrayList<MyObject>();
// + some code to populate your list
eh bien, si la variable dist est en réalité longue, alors vous pourriez essayer d'utiliser
public int compareTo(Tree o) {
return Long.valueOf(this.dist).compareTo(Long.valueOf(o.dist));
}
Cela dépend de comment vous voulez faire les choses? Voulez-vous conserver la mise en œuvre actuelle de Comparable? Si oui, utilisez la méthode de tri qui utilise un comparateur et implémentez un comparateur personnalisé qui utilise les valeurs "longues" réelles de la chaîne (Long.parseLong(dist)
). Si non, alors modifiez simplement la compareTo
actuelle et utilisez les valeurs Long du "dist".
BTW, je revisiterais la logique et me demanderais pourquoi "dist" est de type String alors que c'est en fait un long?
Voici un exemple de tri de fichiers par date à l'aide d'un comparateur long:
public File[] getAllFoldersByDescendingDate(File folder) {
if (!folder.isDirectory()) {
return null;
}
allFiles = folder.listFiles();
Arrays.sort(allFiles, new Comparator<File>()
{
public int compare(final File o1, final File o2)
{
return Long.compare(o2.lastModified(), o1.lastModified());
}
});
return allFiles;
}
Pourquoi pas
public class Tree implements Comparable<Tree> {
public Long dist;
public int compareTo(Tree o) {
return this.dist.compareTo(o.dist);
}
}