web-dev-qa-db-ja.com

Collections.sort(object)を使用したLong値の比較

オブジェクトの単純なリストをlongでソートしようとしています。長い文字列の1つが低い数値で始まるために先頭にプッシュされるため、以下は機能しません。だから私はこれらを実際の長い値で直接ソートする方法を探しています

現在のobj実装は次のようになります。私が使用しているクラスでは、Collections.sort(trees);を呼び出します。

public class Tree implements Comparable<Tree> {
    public String dist; //value is actually Long

    public int compareTo(Tree o) {
        return this.dist.compareTo(o.dist);
    }
}
19
Toran Billups

実際にlongを実際に格納しないのはなぜですか。

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

または、最初に文字列の長さを比較してから、それらを比較します

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

長い値でソートするオブジェクトがあり、それがComparableを実装している場合、Java 7+でLong.compare(long x, long y)を使用できます(これによりint

例えば。

_public class MyObject implements Comparable<MyObject>
{
  public long id;

  @Override
  public int compareTo(MyObject obj) {
    return Long.compare(this.id, obj.id);
  }
}
_

Collections.sort(my_objects)を呼び出します。my_objectsは次のようなものです。

_  List<MyObject> my_objects = new ArrayList<MyObject>();
  // + some code to populate your list
_
30
area5one

dist変数が実際に長い場合は、

public int compareTo(Tree o) {
    return Long.valueOf(this.dist).compareTo(Long.valueOf(o.dist));
}
13
cipher

それはあなたが物事をどのようにしたいかに依存しますか? Comparableの現在の実装を保持しますか?はいの場合、コンパレータを使用するsortメソッドを使用し、文字列の実際の「長い」値を使用するカスタムコンパレータを実装します(Long.parseLong(dist))。いいえの場合、現在のcompareToを変更し、「dist」のLong値を使用します。

ところで、私はロジックを再検討し、「dist」が実際にはLongであるのに、なぜString型であるのかを自問しますか?

3

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

何故なの

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

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