سؤال

إذا كان لدي اثنين byte[] صفائف، هل هناك وظيفة مدمجة لمقارنتها Ala C memcmp() ?

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

المحلول

هناك صفائف. المساواة ().

لا أعرف ما إذا كان تنفيذ JVM يعمل بالفعل في الواقع إذا كانت هناك تعليمات مقابلة في الأجهزة، لكنني أشك في ذلك.

أيضا، إذا كنت أتذكر My C بشكل صحيح، يعمل STRCMP إلى المنهي الخالي (مما يجعلها مفيدة لأسلوت ج)، سيقوم إصدار الصفائف بمقارنة الصفيف بأكمله نظرا لأن مبرمجي Java نادرا ما يكلفون عناء صفائف ذات شهرين. يمكنك بسهولة كتابة وظيفتك الخاصة، رغم ذلك، إذا كنت تهتم بالمنهي الخالي.

نصائح أخرى

إرجاع memcmp int، أقل من، يساوي، أو أكبر من الصفر إذا تم العثور على الأول بايت من S1، على التوالي، ليكون أقل من، لتتناسب، أو أن تكون أكبر من أول بايت واحد من S2. يساوي إرجاع منطقي. انها ليست هي نفس الوظيفة. بالإضافة إلى ذلك، يقارن MemCMP بايتات كحرف غير موقعة.

أعتقد أن هذا قد يعمل:

public int memcmp(byte b1[], byte b2[], int sz){
    for(int i = 0; i < sz; i++){
        if(b1[i] != b2[i]){
            if(b1[i] >= 0 && b2[i] >= 0)
                return b1[i] - b2[i];
            if(b1[i] < 0 && b2[i] >= 0)
                return 1;
            if(b2[i] < 0 && b1[i] >= 0)
                return -1;
            if(b1[i] < 0 && b2[i] < 0){
                byte x1 = (byte) (256 + b1[i]);
                byte x2 = (byte) (256 + b2[i]);
                return x1 - x2;
            }
        }
    }
    return 0;
}

(تحرير) في الواقع، الجزء التكميلي 2 غير ضروري:

public static int memcmp(byte b1[], byte b2[], int sz){
    for(int i = 0; i < sz; i++){
        if(b1[i] != b2[i]){
            if((b1[i] >= 0 && b2[i] >= 0)||(b1[i] < 0 && b2[i] < 0))
                return b1[i] - b2[i];
            if(b1[i] < 0 && b2[i] >= 0)
                return 1;
            if(b2[i] < 0 && b1[i] >=0)
                return -1;
        }
    }
    return 0;
}

نحن سوف، Arrays.equals() جيد، ولكن لا يمكن مقارنة الأسهم. في هذه الحالة هناك أيضا طريق من خلال Arrays.listOf() و لاحقا .subList() ولكن ليس للأولياء مثل byte[].

في الواقع لا يوجد مباشرة memcmp() ما يعادل. هنا نقاش وبمجرد أن أعرف أنه في نفس الحالة الآن (15 عاما). يمكن تحقيق معظم التنفيذ "الأصلي" من خلال خياري من خلال java.nio.ByteBuffer (wrap() الطريقة ثم equals()). لكنها كمية كبيرة إلى حد ما من التعليمات البرمجية.

للأشخاص الذين لا يفهمون تماما الموضوع: memcmp() يتم تنفيذها بطريقة تعتمد على المنصة والتي تعد فعالة للغاية ولا شيء في جافا تقترب منه حاليا. هناك أي دورات يدوية بعيدة كل فترة الأداء على الأقل بسبب الشيكات نطاق الفهرس. ربما سيكون الأشخاص الذين جاءوا في يوم من الأيام الذين جاءوا من C / C ++ المضمنة على هذا الموضوع :-).

صفائف. المساواة] [1

[1]: http://java.sun.com/j2se/1.5.0/docs/api/java/util/arrays.html#equales (البايت [, ، البايت [])

في Java 8، وإذا كنت على ما يرام معاملة بايتات كقيم غير موقعة، ما هو ما يفعله memcmp C / C ++ فعلا:

private static int memcmp(byte[] a, byte[] b, int sz) {
    for (int i = 0; i < sz; i++) {
        if (a[i] != b[i]) {
            return Byte.toUnsignedInt(a[i]) - Byte.toUnsignedInt(b[i]);
        }
    }
    return 0;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top