Java的NavigableMap.floorEntry的C Sharp中的等价物,ceilingEntry

时间:2014-08-14 03:06:12

标签: java c# data-structures

我在Java中多次使用NavigableMap接口,这很方便。

具体来说,我喜欢使用它的floorEntryceilingEntry方法,它们分别为您提供下一个最低或最高的地图条目。

我试图在C#中找到它们的等价物,但我很简短。以下是我想要获得的一个例子。

我已经看过C#SortedDictionary和扩展方法了,虽然它看起来像是在球场上,但我还没找到我正在寻找的东西。

谢谢! →

package com.lewis.needsanavigablemapincsharp;

import java.util.NavigableMap;
import java.util.TreeMap;

public class Main {

    public static void main(String[] args) {

        NavigableMap<Float, String> neededMap = new TreeMap<Float, String>();

        neededMap.put(1.0f, "first!");
        neededMap.put(3.0f, "second!");

        System.out.println("see how useful this is? (looking up indices that aren't in my map)");
        System.out.println(neededMap.floorEntry(2.0f));
        System.out.println(neededMap.ceilingEntry(2.0f));

    }
}

输出是:

  

看看这有用吗? (查找不在我的地图中的索引)
  1.0 =第一!
  3.0 =第二!

2 个答案:

答案 0 :(得分:3)

不幸的是,该解决方案要求您编写自定义扩展。所以,我已经完成了,并将其作为要点上传:SortedDictionaryExtensions.cs

它通过将字典的密钥集转换为列表来使用List<T>.BinarySearch方法。然后,在答案here的帮助下,我们确定密钥是否存在,如果不存在,我们将楼层和天花板值作为按位补码,然后选择我们需要的方法。

请注意我还没有测试过这种算法的效率,但乍一看似乎已经足够了。

你可以这样测试:

SortedDictionary<float, string> neededMap = new SortedDictionary<float, string>();

neededMap.Add(1.0f, "first!");
neededMap.Add(3.0f, "second!");

Console.WriteLine("see how useful this is? (looking up indices that aren't in my map)");
Console.WriteLine(neededMap.FloorEntry(2.0f));
Console.WriteLine(neededMap.CeilingEntry(2.0f));

答案 1 :(得分:0)

使用lambda表达式。也许是最好的方法。

SortedDictionary<float, string> neededMap = new SortedDictionary<float, string>();

neededMap.Add(1.0f, "first!");
neededMap.Add(3.0f, "second!");
//FloorEntry
neededMap.FirstOrDefault(k => k.Key < 2.0f);
//CeilingEntry
neededMap.FirstOrDefault(k => k.Key > 2.0f);