检查地图中的键

时间:2012-06-04 21:07:48

标签: java map

有人可以建议我为什么if条件在下面的代码中不起作用,因为记录的密钥是SiteId。

while (!pdsxOutRecords.isEmpty()) {
PdsxRecord record = pdsxOutRecords.remove(0);
// The below if condition is not working
if(record.getAttrs().containsKey("SiteId")) {
System.out.println("Testing");
}
}

PdsxRecord类就像这样

public class PdsxRecord
{
    private String m_key;
    private Map<PdsxAttrKey, PdsxAttrValue> m_mapAttrs;

}
// constructor
    public PdsxRecord(String key, Map<PdsxAttrKey, PdsxAttrValue> mapAttrs)
    {
        m_key = key;
        m_mapAttrs = mapAttrs;
    }

    public String getKey()
    {
        return m_key;
    }

    public Map<PdsxAttrKey, PdsxAttrValue> getAttrs()
    {
        return m_mapAttrs;
    }

使用record.getAttrs()

打印下面的内容
{Gem.2036=null, Gem.2037=null, Gem.2038=com.ebay.pdsx.common.PdsxAttrValue@6b306b30, Gem.2039=null, Gem.10230=null, Gem.10117=null, Gem.10119=null, Gem.10240=null, UID=com.ebay.pdsx.common.PdsxAttrValue@1e501e50, Gem.10001=null, Gem.10002=com.ebay.pdsx.common.PdsxAttrValue@5d095d09, Gem.10003=null, Gem.10246=null, Gem.10247=null, Gem.60001=null, Gem.10007=null, Gem.10009=null, GEM_ROUTING.PartnerLastModifiedDate=null, Gem.70006=null, CGUID=com.ebay.pdsx.common.PdsxAttrValue@1e361e36, Gem.10173=null, Gem.10097=null, Gem.10131=null, Gem.10010=null, Gem.10132=null, Gem.10177=null, Gem.10178=null, Gem.10179=null, Gem.10015=null, TimeStamp=com.ebay.pdsx.common.PdsxAttrValue@1e571e57, Gem.10016=com.ebay.pdsx.common.PdsxAttrValue@645e645e, Gem.10018=null, Gem.10019=null, Gem.2025=null, SiteId=com.ebay.pdsx.common.PdsxAttrValue@1e3f1e3f, GEM_ROUTING.Partner1LastLoggedInUserId=null, GEM_ROUTING.Partner3LastLoggedInUserId=null, Gem.10181=null, Gem.10182=null, Gem.10183=null, Gem.10185=null, Gem.10187=null, Gem.10101=null, Gem.10189=null, Gem.10102=null, Gem.10026=null, PGuid=com.ebay.pdsx.common.PdsxAttrValue@1e461e46, Gem.2032=null, SGuid=null, Gem.2033=null, Gem.2034=null, Gem.2035=null}

这是下面的PdsxRecord类

    public class PdsxRecord
{
    private String m_key;
    private Map<PdsxAttrKey, PdsxAttrValue> m_mapAttrs;

    // use the other constructor!
    protected PdsxRecord()
    {
    }

    // constructor
    public PdsxRecord(String key, Map<PdsxAttrKey, PdsxAttrValue> mapAttrs)
    {
        m_key = key;
        m_mapAttrs = mapAttrs;
    }

    /**
     * get Key 
     * 
     * @return
     */
    public String getKey()
    {
        return m_key;
    }

    /**
     * get attributes as a map of key=value
     * 
     * @return
     */
    public Map<PdsxAttrKey, PdsxAttrValue> getAttrs()
    {
        return m_mapAttrs;
    }

    /**
     * String -- for debugging and simple persistence
     */
    public String toString()
    {
        UnsynchronizedStringBuffer buf = new UnsynchronizedStringBuffer();
        buf.append("key=" + getKey() + "\n");
        if (getAttrs() == null || getAttrs().size() == 0) {
            return buf.toString();
        }

        for (Map.Entry<PdsxAttrKey, PdsxAttrValue> entry : getAttrs().entrySet()) {
            String key = (entry.getKey()==null ? "null" : entry.getKey().getKey());
            String value = ((entry.getValue() == null ||
                            entry.getValue().getValue() == null) ? 
                        "null" : entry.getValue().getValue().toString());
            buf.append("  " + key + "=" + value +"\n");
        }
        return buf.toString();
    }

}

更新: - PdsxAttrKey的类

public class PdsxAttrKey
    {
        private String m_key;

        protected PdsxAttrKey()
        {
        }

        public PdsxAttrKey(String key)
        {
            m_key = key;
        }

        public String getKey()
        {
            return m_key;
        }

        /**
         * Override the default to allow comparing with Strings 
         */
        public boolean equals(Object o)
        {
            if (o == null) {
                return false;
            }
            if (o instanceof String) {
                return o.equals(m_key);
            }
            if (o instanceof PdsxAttrKey) {
                return m_key.equals(((PdsxAttrKey)o).getKey());
            }
            return false;
        }

        /**
         * hash code implementation
         */
        public int hashCode()
        {
            return (m_key == null ? 0 : m_key.hashCode());
        }

        public String toString()
        {
            return getKey();
        }
    }

3 个答案:

答案 0 :(得分:4)

也许是因为您的地图由PdsxAttrKey组成,并且您正在检查是否存在值为“SiteId”的String的密钥。

如果您不想将地图定义从Map<PdsxAttrKey, PdsxAttrValue>更改为Map<String, PdsxAttrValue>之类的内容,则可能会有一些有用的代码:

while (!pdsxOutRecords.isEmpty()) {
  PdsxRecord record = pdsxOutRecords.remove(0);
  if(record.getAttrs().containsKey(new PdsxAttrKey("SiteId"))) {
    System.out.println("Testing");
  }
}

请注意,这假设您可以将String传递给PdsxAttrKey构造函数,并且可以实例化该类。哦,当然你在课堂上有equals()hashcode(),它几​​乎只检查PdsxAttrKey的字符串值。你可能会问自己这是否真的值得麻烦。这就是为什么我最初建议您更改地图定义以使用字符串作为键,但当然我不确定这是否是一个可行的解决方案。

答案 1 :(得分:2)

record.getAttrs()您正在返回:Map<PdsxAttrKey, PdsxAttrValue>。然后检查是否存在类型为PdsxAttrKey的键(类型:String),值为“SiteId”。

您应检查地图是否包含PdsxAttrKey(在equals中实施hashcodePdsxAttrKey方法)或从PdsxAttrKey中提取密钥并将其与“SiteId”进行比较”

如果你选择迭代试试这个:

            for(PdsxAttrKey key : record.getAttrs().keySet()) {
                if("SiteId".equals(key.getYourKeyStringValue())) {
                    //found
                    break;
                }
            }

否则,您应该在equals中实施hashcodePdsxAttrKey(请记住 - 两者)并调用contains

            PdsxAttrKey lookupKey = new PdsxAttrKey("SiteId"); //with consideration of `equals` method
            if(record.getAttrs().containsKey(lookupKey)) {
                ...
            }

答案 2 :(得分:0)

正如Xeon所说,如果要将对象与字符串值进行比较,则必须覆盖用作键的类中的equalshascode方法,在本例中为PdsxAttrKey 。举个例子:

public class PdsxAttrKey {
    public String name; 

    public PdsxAttrKey(String name) {
        this.name = name;
    }

    @Override
    public int hashCode() {
        return name.hashCode(); 
    }

    @Override
    public boolean equals(Object obj) {
        if(obj == null) {
            return false;
        } else if (obj instanceof PdsxAttrKey) {
            return this.name.equals(((PdsxAttrKey)obj).name);
        }

        return false;
    }

}

或者如果没有真正需要将对象作为键,那么您可以按如下方式重新定义地图声明并使用字符串作为键。

private Map<String, PdsxAttrValue> m_mapAttrs;