根据另一个列表对Java列表进行排序

我有一个如下类型的ArrayList:

class Move{    int from, to;}

“from”属性总是有值。如果“to”属性未设置,则其值为-1。我有以下数组:

int[][] history = new int[50][50];

其中维度对应于Move类的“from”和“to”。在我的搜索函数中,根据某些条件,我需要执行以下操作:

List<move> moves = board.getMoves();for (int i = 0; i < moves.size(); i++)    history[move.from][move.to]++;

因为move.to也可能是-1,我是否应该将二维数组的维度增加1,然后执行以下操作:

history[move.from+1][move.to+]++;

另外,基于上述的移动列表和历史数组,我需要根据相应历史索引的计数器以降序对移动列表进行排序。

这是可能的吗?


回答:

你可以将历史记录设置为HashMap或单独的类来简化这个过程。但因为你也希望能够根据频率对历史进行排序,我建议使用History类:

class Move {   int from, to;   @Override   public int hashCode() {      return from + (to * 100);   }   @Override   public boolean equals(Object o) {      return (o instanceof Move              && ((Move) o).from == from              && ((Move) o).to == to);   }}class History extends Move implements Comparable<History> {   int frequency;   public History(Move m) {      from = m.from;      to = m.to;      frequency = 1;   }   public void increment() {      frequency += 1;   }   public int compareTo(History h) {      // 能够根据频率以降序在TreeSet中排序它      // 请注意,如果你更改频率,它不会重新排序,所以       // 构建集合,然后之后将其转换为TreeSet。      return (frequency == h.frequency) ? 1 : (h.frequency - frequency);   }}

然后创建一个HashMap来快速填充历史记录,并将其转换为TreeSet进行排序:

  List<Move> moves = board.getMoves();  HashMap<History, History> fillTable = new HashMap<History, History>();  for (Move m : moves) {     History h = fillTable.get(m);     if (h == null) {        h = new History(m);        fillTable.put(h, h);     } else {        h.increment();     }  }  TreeSet<History> sorted = new TreeSet<History>(fillTable.values());  .... 准备使用

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注