سؤال

مع النوع عدد صحيح يمكنك القيام بذلك:

int lowest = Integer.MIN_VALUE;

ماذا يمكنني أن أفعل إذا كنت أستخدم الأدوية الجنيسة؟

K lowest = <...>;

أحتاج إلى هذا من أجل تنفيذ شيء مشابه لـ PriorityQueue.لدي إمكانية الوصول إلى العقدة التي أريد إزالتها من قائمة الانتظار، ولكنها ليست الحد الأدنى.

1. I need to make it the min by decreasing the key of that node,
2. And then remove the min.

أنا عالق في الخطوة الأولى.الشيء الوحيد الذي يمكنني فعله هو ضبط مفتاح العقدة على الحد الأدنى الحالي.لست متأكدا أنه يكفي.

هل كانت مفيدة؟

المحلول

وهذا لا يجعل أي معنى ...

وبالنظر إلى أن كنت لا تعرف ما هو K عند هذه النقطة، (أي أنت تنفيذه بشكل عام ... دوه!) لا يمكنك تحديد دقيقة / ماكس ملزمة لذلك.

وفي الحالة التي يكون فيها K يمكن أن يكون الباحث، طويلة، سلسلة أو الكائن، لا يمكن تخمين معقول لاستخدام

وInteger.MIN_VALUE "،" OR NULL.

وأعتقد أن ما كنت تبحث عن K.MIN_VALUE_OF_EVENTUAL_TYPE ولكن هذا لا وجود له.

نصائح أخرى

وليس هناك شكل عام من MIN_VALUE أو MAX_VALUE لجميع أنواع المقارنة.

وفكر فئة Time التي تطبق قابلة للمقارنة. ليس هناك MAX_VALUE للمرة الرغم من أنها غير قابلة للمقارنة.

أحاول أن أتخيل السيناريو الذي يتطلب مثل هذا السلوك.هذا أفضل ما يمكنني التوصل إليه...

تحذير: هذا الرمز خطير.أرجو أن تكون رحيما معي لنشر مثل هذا الرجس.إنه مجرد دليل على المفهوم.

public class Lowest<K> implements Comparable<K> {
    public int compareTo(K other) {
        return -1;
    }
}

وثم...

public class Test {
    public <K extends Comparable<K>> K findMaximum(List<K> values) throws Exception {
        K lowest = (K) new Lowest<K>(); /// XXX DANGER! Losing compile-time safety!!!

        K maximum = lowest;
        for (K value : values) {
            if (maximum.compareTo(value) < 0) {
                maximum = value;
            }
        }

        if (maximum == lowest) {
            throw new Exception("Could not find a maximum value");
        } else {
            return maximum;
        }
    }
}

ويمكنك جعل فئة مجمع أن "ويضيف" الحد الأدنى والحد الأقصى لقيمة لجميع أنواع. انها مجرد حالتين الثابتة التي تمثل الحد الأدنى والحد الأقصى، ثم حالات أخرى التفاف بعض قيمة أخرى من نوع ما. عندما نجري مقارنة، ونحن تحقق إذا كان أحد الأشياء هو الحد الأدنى أو الأقصى، وإرجاع النتيجة الصحيحة. وإلا فإننا لا مجرد المقارنة نفسها كنوع الأساسي. شيء من هذا القبيل:

class Extended<T extends Comparable<? super T>> implements Comparable<Extended<T>> {
    private Extended() { }

    private static Extended min = new Extended();
    private static Extended max = new Extended();

    @SuppressWarnings("unchecked")
    public static <T extends Comparable<? super T>> Extended<T> getMin() {
        return (Extended<T>)min;
    }
    @SuppressWarnings("unchecked")
    public static <T extends Comparable<? super T>> Extended<T> getMax() {
        return (Extended<T>)max;
    }

    public T value;

    public Extended(T x) { value = x; }

    public int compareTo(Extended<T> other) {
        if (this == other) return 0;
        else if (this == min || other == max) return -1;
        else if (this == max || other == min) return 1;
        else return this.value.compareTo(other.value);
    }
}

وإيه ... ما هي المشكلة مرة أخرى؟

PriorityQueue ، مثل كل < وأ href = "http://java.sun.com/javase/6/docs/api/java/util/Collection.html#remove(java.lang.Object)" يختلط = "نوفولو noreferrer"> المجموعات ، يتيح لك استخدام مثيل كائن إلى <لأ href = "http://java.sun.com/javase/6/docs/api/java/util/PriorityQueue.html#remove(java.lang.Object ) "يختلط =" نوفولو noreferrer "> إزالة في هذا الشأن من المجموعة.

واه لا هذا يعتمد على ما K نوع هو؟

ووجهة الوراثة هي أن K يمكن أن يكون أي نوع (أو أي فئة فرعية من نوع معين)؛ من أجل أن تكون قادرة على استدعاء الأساليب على K أو الوصول إلى خصائص ذلك، تحتاج إلى تقييد انها اكتب الحدود مع البدل.

ولمجرد كائن غير قابلة للمقارنة لا يعني أنه لا بد أن يكون قيمة الحد الأدنى. السبب الباحث لديه الحد الأدنى لقيمة من - (2 ^ (31)) لأنك تحتاج 1 بت لعلامة، حتى 2 ^ 31 هي أكبر (أو أصغر) صحيح الممكن أن يمكن تخزينها. لأشياء مثل سلسلة، فإنه لا يجعل أي معنى لأنه ليس هناك أكبر / أصغر سلسلة الممكنة، فمن الذاكرة ملزمة.

وقد تحتاج إلى إنشاء واجهة "IInfinity"، ويكون K يمتد IInfinity، وIInfinity أن يكون وسيلة "getInfinityValue ()"، ثم لف / تمديد عدد صحيح، مزدوجة، BigDecimal وغيرها في فئة التي تطبق IInfinity ... وهتاف اشمئزاز!

وأساسا كنت تريد أي نوع K لتنفيذ بعض المهام ثابتة تقول أدنى وأعلى مما طاعة الخصائص الرياضية القياسية.

وأفترض أن لهذا الشعور أدنى (أو أعلى) لتكون صالحة للاستعمال هل تريد أي كائن مماثلة ليكون لهذه الأساليب. (أو حقول ثابتة). إذا كنت مهتما فقط في كائنات المخصصة الخاصة بك، وطريقة للقيام بذلك سيكون لديك كل ما ترث من نوع بيانات المجرد الذي أعلن حقول ثابتة لMINVALUE وMAX_VALUE ثم varaibles النوع الخاص بك سيكون. اذا كنت بحاجة الى هذه الوظيفة لفئات أخرى سوف تحتاج إلى cre4ate نوعا من hashmap الخارجي الذي يقيس هذه الخصائص لفئات مختلفة (ولكن هذا سوف يحصل قبيحة جدا)

والنظر لا يجعل K من عام، ولكن باستخدام واجهة التي يلتف المجمع البدائي (مجمع مزدوج!).

import java.util.HashMap;


public class NodeWrapper<K extends Comparable<K>> implements Comparable<NodeWrapper<K>> {

    private static HashMap<Class, NodeWrapper> minVals = new HashMap<Class, NodeWrapper>();

    private K value;

    private NodeWrapper() {
        super();
    }

    public NodeWrapper(K value, Class<K> clazz) {
        super();
        this.value = value;

        if (minVals.get(clazz)==null) {
            minVals.put(clazz, new NodeWrapper<K>());
        }
    }

    public K getValue() {
        return value;
    }

    public static NodeWrapper getMinValue(Class clazz){
        return minVals.get(clazz);
    }

    public void setValue(K value) {
        this.value = value;
    }

    @Override
    public int compareTo(NodeWrapper<K> o) {
        NodeWrapper min = minVals.get(this.getClass());
        if (this==min && o==min)  {
            return 0;
        } else if (this==min){
            return -1;
        } else if (o==min){
            return 1;
        } else {
            return this.value.compareTo(o.value);
        }
    }

}

ولفترة وجيزة، والفكرة هي أنه كلما تم إنشاء مثيل فئة جديدة، يتم إنشاء قيمة الحد الأدنى وضعت في hashmap ثابت الذي يقوم بتخزين الحد الأدنى من القيم لكل فئة. (في الواقع، هذه القيم هي لا شيء على الإطلاق، مجرد كائن الحارس، ولكن بما أننا سوف تستخدم المساواة وجوه لتحديد إذا كان هناك شيء هي قيمة دقيقة، وهذا ليس مشكلة على الإطلاق.) كل ما هو ضروري هو أن الكائن ملفوفة تكون قابلة للمقارنة إلى حالات أخرى من نفسها بشكل عام.

وعيب واحد هو أنه عند استدعاء getMinValue سيكون لديك تحذيرات مترجم، لأن نوع الإرجاع لن يكون له المعلومات العامة. قد تكون هناك وسيلة أكثر أناقة حول هذا، ولكن لا أستطيع أن أفكر في ذلك الآن.

وهذه فكرة عامة قد يكون لطيفا وليس بشكل عام. ومع ذلك، أود أن أؤكد حقا: هذا سيكسر تماما إذا حاولت ذلك مع أي تعدد الأشكال أو أي اختلاط الطبقات مقارنة بعضها بعضا. سوف Longs وIntegers في نفس الشجرة تدمر تماما لك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top