দুটি বাইট অ্যারে তুলনা করুন? (জাভা)


96

আমার এতে একটি বাইনারি সিকোয়েন্স সহ বাইট অ্যারে রয়েছে। আমাকে নিশ্চিত করতে হবে যে বাইনারি ক্রমটি এটি হওয়ার কথা। আমি .equalsছাড়াও চেষ্টা করেছি ==, কিন্তু কোনটিই কাজ করে নি।

byte[] array = new BigInteger("1111000011110001", 2).toByteArray();
if (new BigInteger("1111000011110001", 2).toByteArray() == array){
    System.out.println("the same");
} else {
    System.out.println("different'");
}

আপনি কেবল স্ট্রিং সরাসরি তুলনা করতে পারেন?
অবজেক্টগুলি

4
@ অবজেক্টস - শীর্ষস্থানীয় জিরো। এছাড়াও, স্ট্রিং / বিগইন্টেজার স্টাফ কেবল বাইট-অ্যারে তুলনা প্রশ্নকে চিত্রিত করার একটি উপায় হতে পারে।
স্টিফেন সি

আপনি কি তুলনা করার পদ্ধতিটি ব্যবহার করার চেষ্টা করেছেন? BTW ==শুধু FYI আদিম মান তুলনা
ChriskOlson

আংশিক অ্যারে তুলনা সম্পর্কে এখানে সম্পর্কিত প্রশ্ন: stackoverflow.com/questions/16646967/…
ভাদজিম

উত্তর:


168

আপনার উদাহরণে, আপনার কাছে:

if (new BigInteger("1111000011110001", 2).toByteArray() == array)

বস্তুগুলির সাথে কাজ করার সময় ==জাভা রেফারেন্স মানগুলির সাথে তুলনা করে । আপনি অ্যারের সাথে ফিরে toByteArray()আসা রেফারেন্সটি রেফারেন্সের মতো একই কিনা তা যাচাই করে arrayযা অবশ্যই কখনও সত্য হতে পারে না। উপরন্তু, অ্যারে ক্লাসগুলি ওভাররাইড করে না .equals()তাই আচরণটি Object.equals()কেবলমাত্র রেফারেন্স মানগুলির সাথে তুলনা করে।

তুলনা করতে বিষয়বস্তু দুইটি অ্যারের এর স্ট্যাটিক অ্যারে তুলনা পদ্ধতি দ্বারা উপলব্ধ করা হয় অ্যারেগুলির বর্গ

byte[] array = new BigInteger("1111000011110001", 2).toByteArray();
byte[] secondArray = new BigInteger("1111000011110001", 2).toByteArray();
if (Arrays.equals(array, secondArray))
{
    System.out.println("Yup, they're the same!");
}


11

জাভা অপারেটরগুলি ওভারলোড করে না, সুতরাং আপনার অ-বেসিক ধরণের জন্য সাধারণত একটি পদ্ধতি প্রয়োজন। ব্যবহার করে দেখুন Arrays.equals () পদ্ধতি।


11

আপনি Arrays.equals()এবং উভয় ব্যবহার করতে পারেন MessageDigest.isEqual()। যদিও এই দুটি পদ্ধতির কিছু পার্থক্য রয়েছে।

MessageDigest.isEqual()একটি সময়-ধ্রুবক তুলনা পদ্ধতি এবং Arrays.equals()অ-সময়-ধ্রুবক এবং এটি কোনও সুরক্ষা অ্যাপ্লিকেশনে ব্যবহার করলে এটি কিছু সুরক্ষা সমস্যা নিয়ে আসতে পারে।

পার্থক্যের জন্য বিশদটি অ্যারেজ.একুয়ালস () বনাম মেসেজডিজস্ট.আইএসএকুয়াল () এ পড়তে পারবেন


3

অবশ্যই, অ্যারে.ইকুয়াল (বাইট [] প্রথম, বাইট [] দ্বিতীয়) এর গৃহীত উত্তরটি সঠিক। আমি নিম্ন স্তরে কাজ করতে পছন্দ করি তবে সমতা পরীক্ষার রেঞ্জগুলি সম্পাদন করতে আমি নিম্ন স্তরের দক্ষ ফাংশনটি খুঁজে পেতে অক্ষম। কারওর প্রয়োজন হলে আমাকে নিজেরাই চাবুক মেরে ফেলতে হয়েছিল:

public static boolean ArraysAreEquals(
 byte[] first,
 int firstOffset,
 int firstLength,
 byte[] second,
 int secondOffset,
 int secondLength
) {
    if( firstLength != secondLength ) {
        return false;
    }

    for( int index = 0; index < firstLength; ++index ) {
        if( first[firstOffset+index] != second[secondOffset+index]) {
            return false;
        }
    }

    return true;
}

পুরো জিনিসটির চেয়ে অ্যারেগুলির একটি উপসেট পরীক্ষা করার জন্য এটি একটি ভাল সমাধান। যাইহোক, নোট করুন যে অ্যারেস.ইকুয়ালস (বাইট [], বাইট []) আপনি এখানে যা কিছু করেছেন ঠিক তেমন কিছু করে (ব্যতীত দুটি মান একই জিনিস হিসাবে আরও দক্ষতার সাথে পরিচালনা করে এবং নাল অ্যারেগুলি নিখুঁতভাবে পাস করা হ্যান্ডেল করে)। যখন একটি স্ট্যান্ডার্ড লাইব্রেরি প্রয়োগকরণ ব্যবহার করার পছন্দ দেওয়া হয় যা সম্প্রদায় দ্বারা সমর্থিত হবে বা এর একটি কাস্টম বাস্তবায়ন যা আমাকে চিরকালের জন্য সমর্থন করার প্রয়োজন হবে তা লেখার জন্য, আমি প্রতিবারের মতো প্রাক্তনটিকে বেছে নেব।
টম ডিবল

4
উত্তরটি এমন ক্ষেত্রে ব্যবহারের জন্য কার্যকর যেখানে একজনের দুটি অ্যারে থাকে এবং প্রথমে অ্যারের অনুলিপি না করে সেগুলি থেকে ব্রেজের পরিসর তুলনা করতে চান। অ্যারের অনুলিপিগুলি ওভারহেড যুক্ত করে, আবর্জনা যোগ করে এবং প্রয়োজন হয় না। আমার যা দরকার তা হ'ল নিম্ন-স্তরের সি স্টাইলের মেমক্যাম্প () এবং এটি প্রয়োজনীয়তার সাথে খাপ খায়। অবশ্যই, memcmp () মাত্র 1 দৈর্ঘ্যের আর্গুমেন্ট নেয়। এই ফাংশন যথেষ্ট কাছাকাছি।
বামাকো

2

যেহেতু আমি ইউনিট টেস্টের জন্য দুটি অ্যারে তুলনা করতে চেয়েছিলাম এবং আমি এই উত্তরে পৌঁছেছি আমি ভেবেছিলাম আমি ভাগ করতে পারি।

আপনি এটি দিয়ে এটি করতে পারেন:

@Test
public void testTwoArrays() {
  byte[] array = new BigInteger("1111000011110001", 2).toByteArray();
  byte[] secondArray = new BigInteger("1111000011110001", 2).toByteArray();

  Assert.assertArrayEquals(array, secondArray);
}

এবং আপনি আরও ইনফোগুলির জন্য JUnit প্রতিবেদনে অ্যারে তুলনা করে দেখতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.