【问题标题】:ArrayList Sort by priorityArrayList 按优先级排序
【发布时间】:2020-01-27 05:12:14
【问题描述】:

我有一个对象列表,这些对象实际上是棋子。

每个对象都包含价格名称及其在棋盘上的位置。 名字是K代表国王,Q代表女王,R代表车……等等。

所以我有一个ArrayList<Enemy> chesspieces。列表未排序,元素可能是这样的:

P,P,P,P,P,P,P,P,R,N,B,Q,K,B,N,R.

我想创建某种优先级排序,以获得这样的列表:

K,Q, R, R, B, B, N,N,R,R P,P,P,P,P,P,P,P

我开始做某事,但我发现它有缺陷,我不知道如何实现它,这是我到目前为止所做的

这是我更新的 Enemy 类



public class Enemy implements Comparable {

        public Piece name;
        public int rank;
        public int file;
        public String position;
        private int value;

        public Enemy(Piece name, int file, int rank,  String position) {
            this.name = name;
            this.rank = rank;
            this.file = file;
            this.position = position;
        }


    public int getValue(Piece name) {
        if (name.toString() == "k") value = 0;
        if (name.toString() == "Q") value = 1;
        if (name.toString() == "R") value = 2;
        if (name.toString() == "B") value = 3;
        if (name.toString() == "N") value = 4;
        if (name.toString() == "R") value = 5;
        if (name.toString() == "P") value = 6;
        System.out.println("ENMIY : " + name.toString() + " threat" + value);
        return value;
    }


    @Override
    public int compareTo(Object o) {
        if (o instanceof Enemy) {
            Enemy other = (Enemy)o;

            return this.value - other.value;
        } else {
            return 0;
        }
    }
}

这是我的输出

Collections.sort(enemyLocation);// PPNPPPPPPRNBQKBR

【问题讨论】:

  • 初始化逮捕将解决您的第一个问题。 ArrayList sortedThreat = new ArrayList();
  • 不要在 java 中将 == 与字符串一起使用。使用equals()stackoverflow.com/questions/7520432
  • 什么是EnemyPiece
  • 编码getValue() 的更简单方法是value = "kQRBNRP".indexOf(name.toString());

标签: java sorting arraylist


【解决方案1】:

使用下面的代码:

Collections.sort(YourList, YourComparator);

创建Comparator 并将您的逻辑放在int compare(T o1, T o2)

    Collections.sort(list, new Comparator<Piece>() {

        @Override
        public int compare(Piece o1, Piece o2) {
            // Your logic 
            //a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.
            return Your-Return-Value;
        }
    });

在这里查看几个例子Comparator Interface in Java

【讨论】:

  • 初始化逮捕将解决您的第一个问题。
  • 我不确定如何使用它或实现逻辑,我收到很多错误说无法解析符号排序
  • 仔细检查你使用的是Collections.sort()而不是Collection.sort()(注意复数Collections
  • @DavidShapero1。对于错误,导入类 java.util.Collections。 2. 实现方式可以有多种,你可以放 if 条件并基于它返回,或者在你的类中添加新属性作为优先级并添加 int 值并在 compare 方法中使用它。也可以从链接中查看示例。
【解决方案2】:

除了 Sumit Singh 的回答之外,您还可以在您的 EnemyPiece 类上实现 Comparable 接口,并使用 Collections.sort(...) 方法对您的集合进行排序。这是一个例子。

public class Piece implements Comparable {

    private String symbol;
    private int value;

    public Piece(String symbol, int value) {
        this.symbol = symbol;
        this.value = value;
    }

    @Override
    public String toString() {
        return "Piece{" +
                "symbol='" + symbol + '\'' +
                ", value=" + value +
                '}';
    }

    @Override
    public int compareTo(Object o) {
        if (o instanceof Piece) {
            Piece other = (Piece)o;

            return this.value - other.value;
        } else {
            return 0;
        }
    }
}

然后,对您的列表进行排序。

    List<Piece> pieces = new ArrayList<>();
    pieces.add(new Piece("R", 5));
    pieces.add(new Piece("P", 1));
    pieces.add(new Piece("Q", 9));
    pieces.add(new Piece("K", 10));
    pieces.add(new Piece("R", 5));
    pieces.add(new Piece("P", 1));

    Collections.sort(pieces);

    System.out.println(pieces);  //Prints [Piece{symbol='P', value=1}, Piece{symbol='P', value=1}, Piece{symbol='R', value=5}, Piece{symbol='R', value=5}, Piece{symbol='Q', value=9}, Piece{symbol='K', value=10}]

【讨论】:

  • 谢谢,我尝试在我的 Enemy 类中实现它,我创建了一个函数,获取值,它将返回一个 int,0-6,请看一下,并告诉我怎么做完成它。
  • 你有一个计算值的方法,但你从来没有将它分配给你的值变量——所以它总是为零。在 Enemy 构造函数中设置“值”变量 - this.value = getValue(...)。
  • 天哪,它奏效了,你是国王,我爱你,我会做更多的研究来更好地理解它,但如果你能解释一下public int compareTo(Object o) { 这部分,那就太棒了
  • 该方法来自 Comparable 接口 (docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html)。它表示一个对象可以与另一个相同类型的对象进行比较——它可以大于(result > 0)、小于(result
猜你喜欢
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
  • 2011-10-09
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多