3

この質問はチーム メンバーによってここ ( 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 に由来するため、変換をお願いします。

テイカーはいますか?さらに情報が必要な場合は、喜んでさらに話し合います。

4

2 に答える 2

0

次のような 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の回答に行くと思いますが、並べ替えを繰り返すコストが法外な場合は、これが必要な場合があります。

于 2013-04-08T15:00:30.920 に答える