दो सामान्य वस्तुओं की तुलना की समस्याएं

वोट
1

मेरे परियोजना एक फोनबुक कि उपयोग कर रहा है BSTree<E>। पेड़ की प्रत्येक नोड है BTNode<E>। मुख्य वर्ग में, मैं जोड़ी वर्ग है, जो है के साथ ई की जगह (String name, String number), जब मैं नोड्स परिभाषित करते हैं।

मैं 2 ई प्रकार के बीच तुलना करने के लिए निम्नलिखित तुलनित्र वर्ग है:

import java.util.Comparator;

public class BTNodeComparator<E> implements Comparator<E>
{
    public int compare(E a, E b) throws ClassCastException
    {
        return ((Comparable<E>) a).compareTo(b);
    }
}

और मैं में इसका इस्तेमाल करते हैं BSTree<E>

अब, जब मैं इस कार्यक्रम चलाने के लिए और यह तुलनित्र की बात आती है, यह मेरे त्रुटियों तुलनित्र पर देता है, क्योंकि अब यह दो जोड़े के बीच तुलना

कैसे मैं इस मुद्दे को हल कर सकता हूँ? क्या मैं चाहता हूँ दो जोड़े के नामों के बीच तुलना करने के लिए है?

मेरा बुरा स्पष्टीकरण के लिए खेद है। मेरी अंग्रेज़ी कमज़ोर है।

=========================

संपादित करें:

@Tim: अपने समाधान की कोशिश के बाद यह मुझे इस त्रुटि देता है:

java.lang.NullPointerException
    at Pair.compareTo(Pair.java:36) // @ return name.compareTo(pair.getName());
    at Pair.compareTo(Pair.java:2)  // @ public class Pair implements Comparable<Pair>
    at BTNodeComparator.compare(BTNodeComparator.java:24) // @ return (a.compareTo(b));
    at BTNodeComparator.compare(BTNodeComparator.java:20) // @ public class BTNodeComparator<E extends Comparable<E>> implements Comparator<E>
    at BSTree.search(BSTree.java:285)
    at BSTree.insert(BSTree.java:300)
    at PhoneBook.main(PhoneBook.java:25)

Btw, मैं इस प्रकार BSTree में BTNodeComparator decleared:

protected Comparator<E> c = new BTNodeComparator();
if (c.compare(target, cursor.getElement()) < 0) cursor = cursor.getLeft();
06/05/2011 को 02:16
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


1 जवाब

वोट
2

तभी संभव विफलता मैं देख सकता है ClassCastException। अपने कोड को ठीक करने के लिए आप अपने निर्दिष्ट करना होगा Pairइस तरह वर्ग:

class Pair implements Comparable<Pair> {
    String name;
    String number;

    //some implementation stuff...

    @Override
    public int compareTo(Pair o) {
        return name.compareTo(o.name);
    }
}

सामान्य तौर पर, अपने अगर Comparatorकार्यान्वयन सामान्य प्रकार को लागू करने पर निर्भर करता है Comparableतो आप इसे इस तरह का होना चाहिए:

public class BTNodeComparator<E extends Comparable<E>> implements Comparator<E> {
    public int compare(final E a, final E b) {
        return a.compareTo(b);
    }
}

ऐसा करने से सिर्फ आप कैसे के शब्दों को बदले बिना समय सुरक्षा संकलन देता है Comparatorकाम करता है।

अपनी टिप्पणी के आधार पर, मेरा अनुमान है कि आप अपने एम्बेड कर रहे हैं BTNodeComparatorमें BSTreeएक नेस्टेड आंतरिक श्रेणी के है, जो आप शायद इसका मतलब में प्रकार परिभाषा बदले बिना कि परिवर्तन नहीं कर सकते हैं के रूप में वर्ग BSTreeघोषणा।

06/05/2011 को 02:27
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more