我的项目是关于在 java 中实现超图
我的 hyperGraph 包含各种类型的 hyperEdge,具体取决于我拥有的顶点类型
顶点类型:图像,标签...
HyperEdge =Homogeneous(关联相同类型的顶点)/Heterogeneous(关联不同类型的顶点)
Homogeneous HyperEdge= Image-image HyperEdge/Tag-tag hyperEdge
这是一个快速绘制的UML图
这是我的代码
public interface HomogenousHyperedge< T extends Vertex<L>, L> extends Hyperedge {
public abstract List<T> searchNearstNeighborsVertex(
Hypergraph hypergraph, T vertex);
}
public class ImageImageHyperedge implements
HomogenousHyperedge<ImageVertex, Map<String,Instance>> {
@Override
public List<ImageVertex> searchNearstNeighborsVertex(Hypergraph hypergraph,
ImageVertex vertex) {
return null;
}
}
问题出在 ImageImageHyperEdge 类中我应该知道基于它的特征类型是什么我将搜索 ImageVertex 最近的邻居 我不能将它传递给 super 接口(interface)的抽象方法,因为 TagTagHyperEdge 类不需要它
如果我用 {featureOneHyperEdge class ,...featureFiveHyperEdge class } 替换 ImageImageHyperEdge 类(我知道其中的特征类型) 这将是重复的代码,因为它是相同的最近邻搜索算法
feature=图像的低级特征(例如颜色直方图)
我有 5 种低级功能
我将使用每一个来搜索我当前图像的最近邻居
所有功能都存储在一个简单的文本文件中
同样的算法用于搜索最近的邻居
每次只改变文件
最佳答案
您的 UML 设计不够好。跳过丑陋且难以阅读的“样式”,向我们展示“顶点”和“边”,以及关联图;不是您的(可能过于复杂的)继承概念。
您的 API、设计和基本问题并不是很清楚。 'Hyperedge' 类可以表示 Edge 的单个实例,并将其两端相关联;或者它们可以(如果命名更好的话)表示边缘类型,并从指定的端点参数全局搜索图形。
这些是完全不同的设计,你的问题在你弄清楚上面的内容之前是没有意义的。
无论哪种方式,Edge.search() 都没有正确的签名。其中 VS 和 VE 是开始和结束顶点类型,TE 是边缘类型,它应该是:
public class EdgeType {
public List<EV> getEndpoints (SV startVertex);
}
或
public class Vertex {
public List<TE> Vertex.getEdges();
}
public class Edge {
public EV Edge.getEndpoint();
}
最近邻算法应使用泛型类型实现,然后由具体类根据需要(使用准确的类型签名)调用。
顺便说一句,当你提到“最近的邻居”时;也不清楚“最近邻”是指直接连接的顶点,这是微不足道的,还是找到最近的距离(距离如何测量?你没有指定)指定类型的顶点。
无论哪种方式,实现“Edge”子类型的实用性和正确性/需要似乎都不清楚。许多图形算法发现顶点/节点很有趣并对其进行子类型化,但我不太了解导致这些的边缘的子类型化(或子类型化的实用程序)。
最后提示:放弃复杂的命名,KISS。 “顶点”和“边缘”将帮助您获得清晰、简单、易于理解和正确的设计。为 准备好多余的字词。
回应来自 Nawara 的进一步信息:
那么它就是您建模的 EdgeType,当询问“最近邻居”时,您应该采用起始顶点并返回边(如果您需要距离度量)或顶点。
对“Graph”的引用应该从 Vertex 参数中隐含。
就您的 EdgeType 继承层次结构而言:子类型和继承应定义为遵循行为特征,而不是它们引用的通用类型(顶点类型)。 OO 类层次结构设计的原则是模拟做,而不是存在。
在这方面,您可能有一个 KnnDistanceEdgeType 和 FlickrDistanceEdgeType 类,作为祖先,或者,如果没有其他方法行为需要不同,作为实际的实现类。他们正在搜索的特征类型/类可以设置为属性——具有不同的属性和通用化,以回答不同的顶点类型。
例如。
IMAGE_IMAGE_EDGES = new KnnDistanceEdgeType<ImageVertex,ImageVertex>( ImageVertex.class, ImageVertex.class);
TAG_TAG_EDGES = new FlickrDistanceEdgeType<TagVertex,TagVertex>( TagVertex.class, TagVertex.class);
ANY_EDGES = new KnnDistanceEdgeType<Vertex,Vertex>( Vertex.class, Vertex.class);
如果 EdgeType 中有很多其他行为(我们没有定义任何行为,也无法想象),您可以将 KNN 和 Flickr 距离算法移到单独的类中。可能不需要。
记住:在 OO 中,子类是为了行为,而不是为了存在。并给我 +1 票!
关于java - 在这种情况下如何避免代码重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16068061/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/