জাভা বাইট [] অ্যারে কীভাবে তুলনা করবেন?


96
public class ByteArr {

    public static void main(String[] args){
        Byte[] a = {(byte)0x03, (byte)0x00, (byte)0x00, (byte)0x00};
        Byte[] b = {(byte)0x03, (byte)0x00, (byte)0x00, (byte)0x00};
        byte[] aa = {(byte)0x03, (byte)0x00, (byte)0x00, (byte)0x00};
        byte[] bb = {(byte)0x03, (byte)0x00, (byte)0x00, (byte)0x00};

        System.out.println(a);
        System.out.println(b);
        System.out.println(a == b);
        System.out.println(a.equals(b));

        System.out.println(aa);
        System.out.println(bb);
        System.out.println(aa == bb);
        System.out.println(aa.equals(bb));
    }
}

কেন জানি না তারা সবাই মিথ্যা ছাপায়।

আমি যখন "জাভা বাইটেরে" চালাই, উত্তরটি "মিথ্যা মিথ্যা মিথ্যা মিথ্যা"।

আমার মনে হয় a [] সমান বি [] তবে জেভিএম আমাকে বলছে আমি ভুল, কেন ??



Arrays.equals কাজ করে। Onecompiler.com/java/3wc4ec2su
karthikdivi

উত্তর:


196

Arrays.equals()আপনি যদি অ্যারেগুলির প্রকৃত সামগ্রীটির সাথে তুলনা করতে চান তবে আদিম ধরণের মান (বাইটের মতো) থাকে Use

System.out.println(Arrays.equals(aa, bb));

Arrays.deepEqualsঅ্যারেগুলিতে অবজেক্ট রয়েছে এমন তুলনা করার জন্য ব্যবহার করুন ।


যদি আমার একটি 'হ্যাশম্যাপ <বাইট [], আইওফার>' থাকে এবং আমি '(ক, বাফার)' রাখি, যদি আমি মুদ্রণ করি (মানচিত্র.কন্টেনসকি (খ)) 'এটি "মিথ্যা" মুদ্রণ করে, এটি কি একই? কারণ ????
অলস

4
@Lazy: হ্যাঁ, কারণ একই ... আপনি মানচিত্রে কী হিসেবে কাঁচা বাইট [] ব্যবহার করতে পারবেন না ... Read More এখানে: stackoverflow.com/questions/1058149/...
Lukasz

7

কারণ তারা সমান নয়, অর্থাত্: তারা ভিতরে সমান উপাদান সহ বিভিন্ন অ্যারে।

ব্যবহার করার চেষ্টা করুন Arrays.equals()বা Arrays.deepEquals()


এটি জাভা আজেবাজের অংশ: অন্য শ্রেণীর অবজেক্টের তুলনা করার জন্য কেন বিভিন্ন শ্রেণীর স্ট্যাটিক পদ্ধতি ব্যবহার করবেন? তা হ'ল: কেন তারা equals()পদ্ধতিটিকে ওভাররাইড করেনি ?
মার্কিন উইন্ডো

3

বাইট যেমন পরিবর্তনীয় হয় তবে এটি কেবল .equals()একই জিনিস হিসাবে বিবেচিত হয় ।

আপনি যে সামগ্রীগুলি ব্যবহার করতে হবে তা তুলনা করতে চাইলে Arrays.equals(a, b)

বিটিডাব্লু: আমি এটি ডিজাইন করব এমন নয়। ;)


1

তুমি কি দেখেছ Arrays.equals()?

সম্পাদনা করুন: আপনার মন্তব্য অনুসারে, সমস্যাটি হ্যাশম্যাপ কী হিসাবে বাইট অ্যারে ব্যবহার করছে তবে এই প্রশ্নটি দেখুন


যদি আমার একটি 'হ্যাশম্যাপ <বাইট [], আইওফার>' থাকে এবং আমি '(ক, বাফার)' রাখি, যদি আমি মুদ্রণ করি (মানচিত্র.কন্টেনসকি (খ)) 'এটি "মিথ্যা" মুদ্রণ করে, এটি কি একই? কারণ ????
অলস


1

আপনি যদি জেনেরিক হ্যাশম্যাপ কী হিসাবে অ্যারেটি ব্যবহার করার চেষ্টা করছেন তবে এটি কার্যকর হবে না। অ্যারে ধারণ করে এমন একটি কাস্টম মোড়কের জিনিস তৈরি করার বিষয়টি বিবেচনা করুন এবং যার equals(...)এবং hashcode(...)পদ্ধতিটি java.util.Arrays পদ্ধতি থেকে ফলাফলগুলি প্রদান করে। উদাহরণ স্বরূপ...

import java.util.Arrays;

public class MyByteArray {
   private byte[] data;

   // ... constructors, getters methods, setter methods, etc...


   @Override
   public int hashCode() {
      return Arrays.hashCode(data);
   }

   @Override
   public boolean equals(Object obj) {
      if (this == obj)
         return true;
      if (obj == null)
         return false;
      if (getClass() != obj.getClass())
         return false;
      MyByteArray other = (MyByteArray) obj;
      if (!Arrays.equals(data, other.data))
         return false;
      return true;
   }


}

এই মোড়কের ক্লাসের অবজেক্টগুলি আপনার জন্য একটি কী হিসাবে সূক্ষ্মভাবে কাজ HashMap<MyByteArray, OtherType>করবে এবং পরিষ্কার equals(...)এবং ব্যবহারের hashCode(...)পদ্ধতিগুলি ব্যবহারের অনুমতি দেবে ।


0

তারা মিথ্যা প্রত্যাবর্তন করছে কারণ আপনি মান সমতার পরিবর্তে বস্তুর পরিচয়ের জন্য পরীক্ষা করছেন। এটি মিথ্যা প্রত্যাবর্তন করে কারণ আপনার অ্যারেগুলি মেমরিতে আসলে ভিন্ন ভিন্ন জিনিস।

আপনি যদি মান সমতার জন্য পরীক্ষা করতে চান তবে java.util.Arraysহ্যান্ডি তুলনা ফাংশন ব্যবহার করা উচিত

যেমন

import java.util.Arrays;

'''''

Arrays.equals(a,b);


0

এর জন্য চেষ্টা করুন:

boolean blnResult = Arrays.equals(byteArray1, byteArray2);

আমি এই সম্পর্কে নিশ্চিত নই, তবে এটি চেষ্টা করে যা এটি কাজ করে।


0

কেন একটি [] খ সমান হয় না []? কারণ equalsফাংশন সত্যিই বলা Byte[]বা byte[]হয় Object.equals(Object obj)। এই ফাংশনগুলি কেবলমাত্র বস্তুর সনাক্তকরণের সাথে তুলনা করে, অ্যারের সামগ্রীগুলি তুলনা করে না।


0

আমি একটি অ্যারে র‌্যাপারের সন্ধান করলাম যা এটি পেয়ারা ট্রিআরঞ্জ্যাপের সাথে তুলনীয় করে তোলে। শ্রেণি তুলনামূলক গ্রহণ করে না।

কিছু গবেষণা করার পরে আমি বুঝতে পারি যে জেডিকে থেকে বাইটবফারের এই বৈশিষ্ট্য রয়েছে এবং এটি মূল অ্যারেটি অনুলিপি করে না যা ভাল। আপনি আরও বাইটবফার এর সাথে দ্রুত তুলনা করতে পারেন :: asLongBuffer সময়ে 8 বাইট (কপিও করে না)। ডিফল্টরূপে বাইটবফার :: মোড়ক (বাইট []) বিগইডিয়ান ব্যবহার করুন যাতে আদেশের সম্পর্কটি পৃথক বাইটের সাথে তুলনা করার সমান।


0

জাভা বাইট তুলনা,

public static boolean equals(byte[] a, byte[] a2) {
        if (a == a2)
            return true;
        if (a == null || a2 == null)
            return false;

        int length = a.length;
        if (a2.length != length)
            return false;

        for (int i = 0; i < length; i++)
            if (a[i] != a2[i])
                return false;

        return true;
    }

0

কারণ উভয়ই ==বা equals()অ্যারের পদ্ধতিও সামগ্রীর সাথে তুলনা করে না; উভয়ই কেবল অবজেক্টের পরিচয়টি মূল্যায়ন করে ( ==সর্বদা করে, এবং equals()ওভাররাইট করা হয় না, তাই সংস্করণটি Objectব্যবহৃত হচ্ছে)।

বিষয়বস্তুর তুলনা করার জন্য, ব্যবহার করুন Arrays.equals()



0

Arrays.equalsতুলনাকারীর পক্ষে যথেষ্ট নয়, আপনি মানচিত্রে ডেটা রয়েছে তা পরীক্ষা করতে পারবেন না। আমি কোডটি অনুলিপি করে Arrays.equalsএকটি তৈরি করতে সংশোধন করেছি Comparator

class ByteArrays{
    public static <T> SortedMap<byte[], T> newByteArrayMap() {
        return new TreeMap<>(new ByteArrayComparator());
    }

    public static SortedSet<byte[]> newByteArraySet() {
        return new TreeSet<>(new ByteArrayComparator());
    }

    static class ByteArrayComparator implements Comparator<byte[]> {
        @Override
        public int compare(byte[] a, byte[] b) {
            if (a == b) {
                return 0;
            }
            if (a == null || b == null) {
                throw new NullPointerException();
            }

            int length = a.length;
            int cmp;
            if ((cmp = Integer.compare(length, b.length)) != 0) {
                return cmp;
            }

            for (int i = 0; i < length; i++) {
                if ((cmp = Byte.compare(a[i], b[i])) != 0) {
                    return cmp;
                }
            }

            return 0;
        }
    }
}

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