- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在一个项目中使用 Dijkstra 算法,但想尝试使用策略模式实现 Prims 算法,看看它有什么更好的地方,但我不确定如何使用策略模式。我以前从未使用过模式,所以我不知道从哪里开始。
package wpi.cs509.routeFinder;
import wpi.cs509.dataModel.*;
import wpi.cs509.dataManager.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.PriorityQueue;
public class RouteFinder {
public static ArrayList<Point> computePaths(Point source, Graph g, Point destination)
{
if(source.getId()==destination.getId()){
ArrayList<Point> point=new ArrayList<Point>();
point.add(source);
return point;
}
source.minDistance = 0;
PriorityQueue<Point> pointQueue = new PriorityQueue<Point>();
pointQueue.add(source);
while (!pointQueue.isEmpty()) {
Point u = pointQueue.poll();
// Visit each edge exiting u
for (Edge e : g.getNeighbors(u))
{
Point v = g.getPointById(e.getePointId()!=u.getId()?e.getePointId():e.getsPointId());
float weight = e.getWeight();
double distanceThroughU = u.minDistance + weight;
if (distanceThroughU < v.minDistance) {
pointQueue.remove(v);
v.minDistance = distanceThroughU ;
v.previous = u;
pointQueue.add(v);
// System.out.println("u.id is"+u.getId());
}
}
}
return getShortestPathTo(g.getPointById(destination.getId()));
}
public static ArrayList<Point> getShortestPathTo(Point destination)
{
ArrayList<Point> path = new ArrayList<Point>();
for (Point vertex = destination; vertex != null; vertex = vertex.previous)
{
path.add(vertex);
}
Collections.reverse(path);
return path;
}
public static void main(String[] args){
Graph g = new Graph();
ArrayList<Point> p = new ArrayList<Point>();
//g=DataManager.getGraphByNameWithDB("testLab",2);
Point source = new Point();
source.setId(11);
source.setX(111);
source.setY(222);
source.setBuildingName("testLab");
source.setFloorNum(2);
source.setMapEntrance(false);
source.setDestination(true);
source.setName("source");
Point end = new Point();
end.setId(15);
end.setX(161);
end.setY(616);
end.setBuildingName("testLab");
end.setFloorNum(2);
end.setMapEntrance(false);
end.setDestination(true);
end.setName("end");
p=computePaths(source,g,end);
System.out.println(p.size());
for(int i =0;i<p.size();i++)
{
System.out.println("result is "+p.get(i).getId());
}
}
}
最佳答案
策略模式旨在将算法放入一个类中,确保数据相同,以便可以针对多个数据副本重用该算法,而无需创建新的策略实例来处理它们。
除非您确实需要这种行为,否则我建议您不要使用策略模式来开始,因为这在某种程度上削弱了面向对象的设计(通过分离数据和行为)。
相反,尝试使用 Route 接口(interface),它具有两个实现 DikstraRoute
和 PimsRoute
。然后,您的顶级代码将只处理 Route
,而不需要处理它们的实现。
界面
public interface Route {
public ArrayList<Point> getPath();
}
你的构造函数可能看起来像
public DikstraRoute implements Route {
public DikstraRoute(Point start, Graph g, Point destination) {
...
}
@Override
public ArrayList<Point> getPath() {
...
}
}
public PimsRoute implements Route {
public PimsRoute(Point start, Graph g, Point destination) {
...
}
@Override
public ArrayList<Point> getPath() {
...
}
}
接口(interface)保证了“getPath()”操作。
它是一种面向对象的语言,可能时不时地需要编写一些对象。随着时间的推移,全静态的编程方式不会为您提供任何类型的维护优势(所以它还不如 C)。
如果您发现(在达到这个中间值之后)您确实需要一个策略,那么请将您传递给构造函数的对象移动到接口(interface)中的方法中。剪切之前(上面)解决方案中的所有内部字段,您将把 Route
对象转换为 Route
策略。请记住,如果您的对象仅包含代码,但没有状态,那么它实际上是一种策略。
为了演示,策略方法如下所示
界面
public interface Route {
public ArrayList<Point> getPath(Point start, Graph g, Point destination);
}
你的构造函数可能看起来像
public DikstraRoute implements Route {
public DikstraRoute() {
...
}
@Override
public ArrayList<Point> getPath(Point start, Graph g, Point destination) {
...
}
}
public PimsRoute implements Route {
public PimsRoute() {
...
}
@Override
public ArrayList<Point> getPath(Point start, Graph g, Point destination) {
...
}
}
关于java - 实现 Prim 算法的策略模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34007375/
对此感到疯狂,真的缺少一些东西。 我有webpack 4.6.0,webpack-cli ^ 2.1.2,所以是最新的。 在文档(https://webpack.js.org/concepts/mod
object Host "os.google.com" { import "windows" address = "linux.google.com" groups = ["linux"] } obj
每当我安装我的应用程序时,我都可以将数据库从 Assets 文件夹复制到 /data/data/packagename/databases/ .到此为止,应用程序工作得很好。 但 10 或 15 秒后
我在 cc 模式缓冲区中使用 hideshow.el 来折叠我不查看的文件部分。 如果能够在 XML 文档中做到这一点就好了。我使用 emacs 22.2.1 和内置的 sgml-mode 进行 xm
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
根据java: public Scanner useDelimiter(String pattern) Sets this scanner's delimiting pattern to a patt
我读过一些关于 PRG 模式以及它如何防止用户重新提交表单的文章。比如this post有一张不错的图: 我能理解为什么在收到 2xx 后用户刷新页面时不会发生表单提交。但我仍然想知道: (1) 如果
看看下面的图片,您可能会清楚地看到这一点。 那么如何在带有其他一些 View 的简单屏幕中实现没有任何弹出/对话框/模式的微调器日期选择器? 我在整个网络上进行了谷歌搜索,但没有找到与之相关的任何合适
我不知道该怎么做,我一直遇到问题。 以下是代码: rows = int(input()) for i in range(1,rows): for j in range(1,i+1):
我想为重写创建一个正则表达式。 将所有请求重写为 index.php(不需要匹配),它不是以/api 开头,或者不是以('.html',或'.js'或'.css'或'.png'结束) 我的例子还是这样
MVC模式代表 Model-View-Controller(模型-视图-控制器) 模式 MVC模式用于应用程序的分层开发 Model(模型) - 模型代表一个存取数据的对象或 JAVA PO
我想为组织模式创建一个 RDF 模式世界。您可能知道,组织模式文档基于层次结构大纲,其中标题是主要的分组实体。 * March auxiliary :PROPERTIES: :HLEVEL: 1 :E
我正在编写一个可以从文件中读取 JSON 数据的软件。该文件包含“person”——一个值为对象数组的对象。我打算使用 JSON 模式验证库来验证内容,而不是自己编写代码。符合代表以下数据的 JSON
假设我有 4 张 table 人 公司 团体 和 账单 现在bills/persons和bills/companys和bills/groups之间是多对多的关系。 我看到了 4 种可能的 sql 模式
假设您有这样的文档: doc1: id:1 text: ... references: Journal1, 2013, pag 123 references: Journal2, 2014,
我有这个架构。它检查评论,目前工作正常。 var schema = { id: '', type: 'object', additionalProperties: false, pro
这可能很简单,但有人可以解释为什么以下模式匹配不明智吗?它说其他规则,例如1, 0, _ 永远不会匹配。 let matchTest(n : int) = let ran = new Rand
我有以下选择序列作为 XML 模式的一部分。理想情况下,我想要一个序列: 来自 my:namespace 的元素必须严格解析。 来自任何其他命名空间的元素,不包括 ##targetNamespace和
我希望编写一个 json 模式来涵盖这个(简化的)示例 { "errorMessage": "", "nbRunningQueries": 0, "isError": Fals
首先,我是 f# 的新手,所以也许答案很明显,但我没有看到。所以我有一些带有 id 和值的元组。我知道我正在寻找的 id,我想从我传入的三个元组中选择正确的元组。我打算用两个 match 语句来做到这
我是一名优秀的程序员,十分优秀!