オブジェクトの単純なリストを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);
}
}
実際に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);
}
長い値でソートするオブジェクトがあり、それが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
_
dist変数が実際に長い場合は、
public int compareTo(Tree o) {
return Long.valueOf(this.dist).compareTo(Long.valueOf(o.dist));
}
それはあなたが物事をどのようにしたいかに依存しますか? Comparableの現在の実装を保持しますか?はいの場合、コンパレータを使用するsortメソッドを使用し、文字列の実際の「長い」値を使用するカスタムコンパレータを実装します(Long.parseLong(dist)
)。いいえの場合、現在のcompareTo
を変更し、「dist」のLong値を使用します。
ところで、私はロジックを再検討し、「dist」が実際にはLongであるのに、なぜString型であるのかを自問しますか?
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;
}
何故なの
public class Tree implements Comparable<Tree> {
public Long dist;
public int compareTo(Tree o) {
return this.dist.compareTo(o.dist);
}
}