哪种数据结构对键值对有效?

时间:2017-06-21 05:15:48

标签: java data-structures

func nextImage()
 {
        i += 1
       if (i < arrPhoto.count)
       {
       imgView.image = UIImage(named: arrayPhoto[i])
       }
}

如果输入为4,则输出A,输入为8,输出为B,依此类推。 我可以使用哪种数据结构来存储以下数据,因此您不应多次存储值。

我说HashMap,但效率不高。

P.S。我在接受采访时被问过。

3 个答案:

答案 0 :(得分:5)

使用TreeMap存储值,其中key是间隔的结束点。然后检索任何键的floorKey()ceilingKey()的数据,如果两个值相同,则返回它,否则返回null。这里的每个查询都需要O(log n)时间来回答,但与其他方法相比,空间复杂度非常低。在这里,我认为每个interval的值都是唯一的,并且每个键只有一个与之关联的值。

TreeMap<Integer,String> map = new TreeMap<Integer,String>();

map.put(1,"A"); map.put(5,"A");
map.put(7,"B"); map.put(10,"B");
map.put(11,"C"); map.put(15,"C");

System.out.println(getData(4));
System.out.println(getData(6));
static String getData(int key)
{
    Integer ceiling_key= map.ceilingKey(key);
    Integer floor_key = map.floorKey(key);

    if(ceiling_key == null || floor_key == null)
        return null;

    String value1 = map.get(ceiling_key);
    String value2 = map.get(floor_key);

    if(value1.equals(value2))
        return value1;
    else
        return null;

}

输出

A
null

答案 1 :(得分:1)

我认为面试官正在寻找ConcurrentNavigableMap的答案

可以容纳多个值为

的键

在你的情况下:

public static NavigableMap<Integer, String> map = new TreeMap<Integer, String>();
    static {
        map.put(1, "A"); // 1..5 => A
        map.put(6, null); // 6  => empty
        map.put(7, "B"); // 7..10 => N
        map.put(11, "C"); // 11..15 => C
        map.put(16, null); // 16.. => empty
    }

然后用

获取值
map.floorEntry(4).getValue()

答案 2 :(得分:0)

由于不重复键,您可以使用数组索引作为键:

int[] array = {0,A,A,A,A,A,0,B,B,B,B,C,C,C,C,C,};

现在位于array[1] - array[5],价值Aarray[7] - array[10] 值为B