从排序的TreeMap获取值

时间:2015-02-17 10:03:27

标签: java dictionary

我有一张有序的地图

Map<RangeValues,String> cIndexes = new TreeMap(new StartIndexComparator());

其中key是包含两个整数值的类的对象。

public class RangeValues {


    private int startIndex;
    private int endIndex;
}

因此,当我尝试从该地图访问该值时,我将null作为值。

Set<RangeValues> keySet = cIndexes.keySet();
RangeValues[] keys = keySet.toArray(new RangeValues[keySet.size()]);

for(int index = 0; index < keys.length-1; index++)
{
   **cIndexes.get(keys[index]) // this is giving null**
   int nextIndex = keys[index+1].getStartIndex();
}

比较器的实施是

public class StartIndexComparator implements Comparator<RangeValues> {

    @Override
    public int compare(RangeValues r1, RangeValues r2) {

        if(r1.getStartIndex() > r2.getStartIndex())
        {
            return 1;
        }
        else 
        {
            return -1;
        }

    }
}

填写地图

RangeValues range = new RangeValues();
range.setStartIndex();
range.setEndIndex();
cIndexes.put(range,conjunctions.get(conjIndex));

如何使用object作为键从该映射中获取值。

2 个答案:

答案 0 :(得分:1)

您需要在对象中覆盖用作键的equals和hashCode方法

public class RangeValues {


    private int startIndex;
    private int endIndex;
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + endIndex;
        result = prime * result + startIndex;
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        RangeValues other = (RangeValues) obj;
        if (endIndex != other.endIndex)
            return false;
        if (startIndex != other.startIndex)
            return false;
        return true;
    }


}

上面的equals和hashCode方法假设startIndex和endIndex都参与决定你的类的两个对象是否相等。

答案 1 :(得分:0)

您可能未在equals课程中履行hashCode / RangeValues合同。

因此,无法保证cIndexes.get(keys[index])不会返回null