Java 您可以混合使用抽象数据类型吗?e、 g.地图的优先队列?

Java 您可以混合使用抽象数据类型吗?e、 g.地图的优先队列?,java,algorithm,dictionary,priority-queue,abstract-data-type,Java,Algorithm,Dictionary,Priority Queue,Abstract Data Type,我正在做一个解决数独问题的项目。这是我大学模块的一部分,当我一直在计划我的方法时,我想尝试使用优先级队列来决定下一步在数独中使用哪个单元 我应该在优先级队列中存储什么 我想我可以存储单元格(例如网格[x][y]),但是,这是一个棘手的部分。我通过可以进入单元的可能组合的数量,计算出某个位置单元的优先级。但是我无法存储每个单元格有多少个组合,所以我考虑使用一个map数据类型来存储网格位置作为键,可能的组合作为值。然后我将使用这些值的优先级队列,这些值将指向网格位置 我对Java或数据结构没有太多经

我正在做一个解决数独问题的项目。这是我大学模块的一部分,当我一直在计划我的方法时,我想尝试使用优先级队列来决定下一步在数独中使用哪个单元

我应该在优先级队列中存储什么

我想我可以存储单元格(例如网格[x][y]),但是,这是一个棘手的部分。我通过可以进入单元的可能组合的数量,计算出某个位置单元的优先级。但是我无法存储每个单元格有多少个组合,所以我考虑使用一个map数据类型来存储网格位置作为键,可能的组合作为值。然后我将使用这些值的优先级队列,这些值将指向网格位置


我对Java或数据结构没有太多经验,但我真的很喜欢这种方法。任何帮助都将不胜感激

由于您尚未发布代码,我无法评论这是否是最佳方法。但你的问题的答案是肯定的

首先让我总结一下(我理解)您想要实现的目标:您有两个对象(网格单元或它们的坐标)。您还有一个为每个对象指定优先级的贴图。现在,您需要建立一个优先级队列,根据映射中的优先级对对象进行排序

这可以通过向优先级队列提供自定义的
比较器来实现。比较器获取对象(在我们的例子中,是两个网格单元)并返回两个网格单元中较小的一个(或者在优先级队列的概念中,哪个是第一个)。我们的特殊比较器需要访问带有组合数的
映射。一旦它有了这个访问权限,比较两个
GridCell
s就很容易了。这是通讯员:

类GridCellComparer实现Comparator{
//使用每个网格单元的组合数引用地图
地图组合;
公共GridCellComparier(地图组合){
这个组合=组合;
}
//计算哪个网格单元最先出现
公共整数比较(网格单元格c1、网格单元格c2){
返回组合.get(c2)-组合.get(c1);
}
}
要使用这个比较器,我们需要使用构造函数重载
PriorityQueue
,它接受一个
comparator
。此重载还占用初始容量,我们可以将其设置为要添加的单元数:

PriorityQueue prio=new PriorityQueue(cells.size(),new GridCellComparer(组合));
其余的与任何其他优先级队列一样工作。您可以添加网格单元等等。这是一个完整的例子。代码的第一部分生成几个网格单元,并为它们设置许多组合。网格单元内的
int n
仅用于在打印它们时识别它们

import java.util.Map;
导入java.util.HashMap;
导入java.util.PriorityQueue;
导入java.util.List;
导入java.util.ArrayList;
导入java.util.Comparator;
公开课范例{
公共静态void main(字符串[]args){
//映射每个单元格的组合数
映射组合=新的HashMap();
//网格单元列表
列表单元格=新的ArrayList();
对于(int i=0;i<5;++i)
添加(新网格单元(i));
//为每个网格单元添加组合数
组合.put(cells.get(0),2);
组合.put(cells.get(1),0);
组合。放置(单元格。获取(2),6);
组合。放置(单元格。获取(3),4);
组合。放置(单元格。获取(4),10);
//实例化优先级队列
PriorityQueue prio=新的PriorityQueue(cells.size(),新的GridCellComparer(组合));
优先级addAll(单元格);
//按组合数的顺序检索网格单元
而(!prio.isEmpty()){
GridCell-topCell=prio.poll();
系统输出打印项次(topCell);
}
}
}
类网格单元{
//用于标识单元格的编号
私人int n;
公共网格单元(intn){this.n=n;}
公共字符串toString(){
返回整数.toString(n);
}
}
类GridCellComparer实现Comparator{
//使用每个网格单元的组合数引用地图
地图组合;
公共GridCellComparier(地图组合){
这个组合=组合;
}
//计算哪个网格单元最先出现
公共整数比较(网格单元格c1、网格单元格c2){
返回组合.get(c2)-组合.get(c1);
}
}
运行此代码时,您将看到以下输出:

4
2
3
0
1

这些是从高组合数到低组合数排序的GridCell ID。

是的,这正是我想知道的,我甚至不认为这是可能的,您设法记下了我关于grid cell等的笔记,并将其写入代码,非常感谢:)