web-dev-qa-db-fra.com

Comparaison de valeurs longues à l'aide de Collections.sort (objet)

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);
    }
}
14
Toran Billups

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);
}
17
ratchet freak

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
28
area5one

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));
}
14
cipher

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?

3
Sanjay T. Sharma

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;
}
3
djangofan

Pourquoi pas

public class Tree implements Comparable<Tree> {
    public Long dist;

    public int compareTo(Tree o) {
        return this.dist.compareTo(o.dist);
    }
}
0
astay13