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。

人吗?如果你需要进一步的信息,我很乐意与你进一步讨论。

JAVA到c#的转换-优先级队列

我想你可能会像这样滥用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()