Java 如何比较和排序树集中的项目?
我有一门课叫《玩家与输赢》Java 如何比较和排序树集中的项目?,java,sorting,Java,Sorting,我有一门课叫《玩家与输赢》 public class Player { private String name ; private int ranking=0; private int wins = 0 ; private int lossess = 0 ; private boolean isPrivate =false; pri
public class Player
{
private String name ;
private int ranking=0;
private int wins = 0 ;
private int lossess = 0 ;
private boolean isPrivate =false;
private int experiance =0;
public float getWinRatio()
{
if( getExperiance() <= 0 ) return -0.0f ;
return (getWins()/(float)getExperiance()) ;
}
公共类播放器
{
私有字符串名称;
私人整数排名=0;
私有整数=0;
私有int lossess=0;
私有布尔值isPrivate=false;
私人内部经验=0;
公共浮点数getWinRatio()
{
如果(getExperiance()您需要在类中正确声明您的方法,以便对其进行编译。但一旦这样做,您可以像这样将比较器
传递到树集
Set<Integer> set = new TreeSet<>(Comparator.reverseOrder());
Set<Player> players =
new TreeSet<>(Comparator.comparing(Player::getWinRatio).reversed());
Set players=new TreeSet(Comparator.comparing(Player::getWinRatio));
在这里,我只是将值添加到树集
int[] numbs = { 5, 3, 1, 4, 2, 9, 7, 6, 8
};
// Integer has a natural ordering in ascending order so no
// Comparator was needed
Set<Integer> set = new TreeSet<>();
for (int n : numbs) {
set.add(n);
}
如果要按相反的顺序对它们进行排序,可以像这样分配树集
Set<Integer> set = new TreeSet<>(Comparator.reverseOrder());
Set<Player> players =
new TreeSet<>(Comparator.comparing(Player::getWinRatio).reversed());
Set Set=newtreeset(Comparator.reverseOrder());
对于赢配给排序,您可以像这样颠倒顺序
Set<Integer> set = new TreeSet<>(Comparator.reverseOrder());
Set<Player> players =
new TreeSet<>(Comparator.comparing(Player::getWinRatio).reversed());
设置玩家=
新树集(Comparator.comparing(Player::getWinRatio.reversed());
您需要使用比较器创建一个新的树集
,该比较器根据winRatio
对玩家进行比较。然后,您只需将玩家从原始树集
复制到新的树集
。以下是参考代码:
import java.util.Comparator;
import java.util.TreeSet;
class Player {
private String name;
private int ranking = 0;
private int wins = 0;
private int lossess = 0;
private boolean isPrivate = false;
private int experiance = 0;
public Player(String name, int ranking, int wins, int lossess, boolean isPrivate, int experiance) {
super();
this.name = name;
this.ranking = ranking;
this.wins = wins;
this.lossess = lossess;
this.isPrivate = isPrivate;
this.experiance = experiance;
}
String getName() {
return name;
}
public int getExperiance() {
return experiance;
}
public int getWins() {
return wins;
}
public float getWinRatio() {
if (getExperiance() <= 0)
return -0.0f;
return (getWins() / (float) getExperiance());
}
@Override
public String toString() {
return "Player [name=" + name + ", ranking=" + ranking + ", wins=" + wins + ", lossess=" + lossess
+ ", isPrivate=" + isPrivate + ", experiance=" + experiance + "]";
}
}
class DefaultComparator implements Comparator<Player> {
@Override
public int compare(Player p1, Player p2) {
return p1.getName().compareTo(p2.getName());
}
}
class PlayerWinRatioComparator implements Comparator<Player> {
@Override
public int compare(Player p1, Player p2) {
return p1.getWinRatio() > p2.getWinRatio() ? 1 : (p1.getWinRatio() == p2.getWinRatio() ? 0 : -1);
}
}
public class TreeSetExample {
public static void main(String[] args) {
TreeSet<Player> original = new TreeSet<Player>(new DefaultComparator());
original.add(new Player("A", 5, 1, 2, true, 4));
original.add(new Player("B", 4, 2, 1, false, 5));
original.add(new Player("C", 2, 3, 2, true, 3));
original.add(new Player("X", 3, 2, 3, false, 2));
original.add(new Player("Y", 6, 4, 2, true, 1));
original.add(new Player("Z", 1, 2, 4, true, 6));
TreeSet<Player> copy = new TreeSet<Player>(new PlayerWinRatioComparator());
// Copy the elements of original TreeSet to the copy TreeSet
for (Player player : original) {
copy.add(player);
}
//Display the elements copy TreeSet
for (Player player : copy) {
System.out.println(player);
}
}
}
请详细说明。我这样做了。那么for循环/for each循环是什么样子来比较玩家之间的关系的呢?TreeSet
将根据项目之间的自然关系自动对项目进行排序。可以是名称、数字等。您没有在类中实现Comparable
接口,但您可以证明当你通过传递一个比较器来创建树集时,ide是一个。它只是根据获胜率对所有项目进行排序。你不需要循环。树集在你添加项目时为你做这件事。我将发布一个示例。好的,谢谢。假设我有一个方法,可以循环所有项目并将它们与em通过嵌套for循环相互连接。现在可以完全删除该方法,并对项目进行排序。正确?正确!只需使用树集进行尝试。树集就是这样做的。它们根据您希望对它们进行排序的方式维护排序顺序。谢谢,这使我了解了如何进行排序!