-2

谁能建议我为什么 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();
        }
    }
4

3 回答 3

4

也许是因为您的 Map 由PdsxAttrKey一个键组成,并且您正在检查是否有一个String值为“SiteId”的键。

如果您不想将 Map 定义从以下内容更改为以下内容,这里有一些可能有用的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。你可能会问自己这是否真的值得麻烦。这就是为什么我最初建议您更改 Map 定义以使用字符串作为键,但当然我不确定这是否是您的情况的可行解决方案。

于 2012-06-04T21:13:24.713 回答
2

record.getAttrs()你回来的时候:Map<PdsxAttrKey, PdsxAttrValue>。然后检查是否有类型为“SiteId”的键(类型PdsxAttrKey:)String

您应该检查地图是否包含PdsxAttrKey(实现equalshashcode方法PdsxAttrKey)或从中提取键PdsxAttrKey并将它们与“SiteId”进行比较。

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

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

否则,您应该在和调用中实现equalshashcode(记住 - 两者):PdsxAttrKeycontains

            PdsxAttrKey lookupKey = new PdsxAttrKey("SiteId"); //with consideration of `equals` method
            if(record.getAttrs().containsKey(lookupKey)) {
                ...
            }
于 2012-06-04T21:13:32.957 回答
0

正如至强所说,如果要将对象与字符串值进行比较,则必须覆盖用作键的类中的equalsand方法,在这种情况下, . 举个例子:hascodePdsxAttrKey

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;

于 2012-06-05T00:29:19.937 回答