Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何比较和排序树集中的项目?_Java_Sorting - Fatal编程技术网

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循环相互连接。现在可以完全删除该方法,并对项目进行排序。正确?正确!只需使用树集进行尝试。树集就是这样做的。它们根据您希望对它们进行排序的方式维护排序顺序。谢谢,这使我了解了如何进行排序!