gpt4 book ai didi

java - 改变java类排序标准的好方法

转载 作者:行者123 更新时间:2023-12-01 18:00:07 29 4
gpt4 key购买 nike

我有一个代表一列的类。它有一个比较器,看起来像这样:

class Column
{
int xposition;
int usage;

@Override
public int compare(Object arg0, Object arg1)
{
// sort logic
}
}

我有一个由Column组成的TreeSet。我想首先按 x-positionTreeSet 进行排序,然后在某个时刻按usage 进行排序。

我尝试创建一个父类(super class),例如 Column2,它扩展 Column 并具有不同的 compare 方法。然而,这使得从 Column 到 Column2 的转换(反之亦然)变得非常难看。我还想到了 Column 中的一个标志来指示如何进行排序,但这意味着要修改所有对象才能更改排序标准。

有没有更好的方法来做到这一点?

最佳答案

我将在一组外部Comparator中使用比较逻辑来表示您拥有的不同排序情况,然后在您想要更改时创建一个新的TreeSet排序:

class Column
{
int xposition;
int usage;

public static final Comparator<Column> SortByX = new Comparator<Column>() {
@Override
public int compare(Column c1, Column c2)
{
return Integer.compare(c1.xposition, c2.xposition);
}
};

public static final Comparator<Column> SortByUsage = new Comparator<Column>() {
@Override
public int compare(Column c1, Column c2)
{
return Integer.compare(c1.usage, c2.usage);
}
};
}

TreeSet<Column> cols = new TreeSet<>(Column.SortByX);

然后,更改排序:

TreeSet<Column> updated = new TreeSet<>(Column.SortByUsage);
updated.addAll(cols);
cols = updated;

如果在多线程环境中发生这种情况,请进行适当的同步。

无论您做什么,都不要使用可变状态更改对象的Comparator 行为。如果这样做,在将对象放入 TreeSet 等集合中后,您可能很容易“失去对它的跟踪”。

关于java - 改变java类排序标准的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41681584/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com