JAVA到c#的转换-优先级队列
本文关键字:优先级 队列 转换 JAVA | 更新日期: 2023-09-27 18:08:17
这个问题是由一个团队成员在这里(https://stackoverflow.com/questions/15881110/java-to-c-sharp-conversion)发布的,但由于社区没有足够的信息而被关闭。
这是我试图恢复这样一个问题是,我该如何去转换这个java提取到c# ?
Java提取:
PriorityQueue<PuzzleNode> openList = new PriorityQueue<PuzzleNode>
(1,
new Comparator<PuzzleNode>(){
public int compare(PuzzleNode a, PuzzleNode b){
if (a.getPathCost() > b.getPathCost())
return 1;
else if (a.getPathCost() < b.getPathCost())
return -1;
else
return 0;
}
}
);
一个sortedList已经考虑过,但无济于事,因为我不确定如何编码它。
我也试着用一个方法创建一个标准列表:
List<PuzzleNode> openList = new List<PuzzleNode>();
//Method to sort the list
public int CompareFCost(PuzzleNode a, PuzzleNode b)
{
if (a.getPathCost() > b.getPathCost())
{
return 1;
}
else if (a.getPathCost() > b.getPathCost())
{
return -1;
}
else
return 0;
}//end CompareFCost
,然后调用:openList.Sort(CompareFCost);在适当的位置,但这不起作用。
代码的作用是什么?它根据我在程序中设置的分数(pathCost)来排序对象'PuzzleNode'。然后,while循环操作并从列表中取出第一个对象。列表需要排序,否则会选择具有较高pathCost的对象,while循环将运行更长时间。目标是从列表中拉出较低的pathCost。
我要求转换,因为它在Java &其余的代码基本上来自Java。
人吗?如果你需要进一步的信息,我很乐意与你进一步讨论。
我想你可能会像这样滥用SortedList:
var openList=new SortedList<PuzzleNode,PuzzleNode>(
//assumes .Net4.5 for Comparer.Create
Comparer<PuzzleNode>.Create((a,b)=>{
if (a.getPathCost() > b.getPathCost())
return 1;
else if (a.getPathCost() < b.getPathCost())
return -1;
else
return 0;
}));
openList.Add(new PuzzleNode());
foreach(var x in openList.Keys)
{
//ordered enumeration
}
var firstItem = openList.Dequeue();
通过创建一些扩展方法使其更像队列
static class SortedListExtensions
{
public static void Add<T>(this SortedList<T,T> list,T item)
{
list.Add(item,item);
}
public static T Dequeue<T>(this SortedList<T,T> list)
{
var item=list.Keys.First();
list.Remove(item);
return item;
}
//and so on...
}
TBH,我可能会选择@valverij在评论中对你最初问题的回答,但如果重复排序的成本令人望而生畏,这可能是你所需要的。
代码的作用是什么?命令对象'PuzzleNode'这取决于我在程序中设置的分数(pathCost)。然后,while循环操作并从列表中取出第一个对象。该列表需要排序,否则是一个具有更高级别的对象可以选择pathCost, while循环将运行更长时间。的目标是从列表中取出较低的pathCost。
-
1:有
LinQ
。在c#中你通常不会做这些事情,因为LinQ会帮你做。-
根据分数(pathCost)命令对象'PuzzleNode'
是用LinQ的
Enumerable.OrderBy()
扩展实现的://Assuming PathCost is a property of a primitive type (int, double, string, etc) var orderedlist = list.OrderBy(x => x.PathCost);
-
目标是从列表中拉出较低的pathCost。
这是使用LinQ的
Enumerable.Min()
或Enumerable.Max()
扩展实现的。//Same assumption as above. var puzzlewithlowestpath = list.Min(x => x.PathCost);
-
我在这里抱怨java与c#相比是不完整的,因为它缺少LinQ
之类的东西,但我现在不会再在StackOverflow上抱怨了。
我想提到的另一件事是,如果你用c#编码,你最好使用c#命名约定,其中属性是propercase:
public int PathCost {get;set;}
//or double or whatever
代替:
public int getPathCost()
public int setPathCost()