-2

レコードがSiteIdとしてキーを持っているため、以下のコードでif条件が機能しない理由を誰でも教えてもらえますか?

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

おそらく、マップがキーとして構成されており、値「SiteId」を持つPdsxAttrKeyキーがあるかどうかを確認しているためです。String

Map<PdsxAttrKey, PdsxAttrValue>Map 定義を からのようなものに変更したくない場合に役立つコードを次に示しますMap<String, PdsxAttrValue>

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

これは、文字列を PdsxAttrKey コンストラクターに渡すことができ、クラスをインスタンス化できることを前提としていることに注意してください。ああ、もちろん、クラスにはequals()とがあります。これは、 の の文字列値のみをチェックするだけです。これが本当に手間をかける価値があるかどうかを自問するかもしれません。そのため、マップ定義を変更して文字列をキーとして使用することを最初に提案しましたが、もちろん、これがあなたの場合に実行可能な解決策であるかどうかはわかりません。hashcode()PdsxAttrKey

于 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;
                }
            }

equalsそれ以外の場合は、 and hashcode(覚えておいてください - 両方) in PdsxAttrKeyand invokeを実装する必要がありcontainsます。

            PdsxAttrKey lookupKey = new PdsxAttrKey("SiteId"); //with consideration of `equals` method
            if(record.getAttrs().containsKey(lookupKey)) {
                ...
            }
于 2012-06-04T21:13:32.957 に答える
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;

于 2012-06-05T00:29:19.937 に答える