1. طريقة للتحقق مما إذا كان الصفيف يحتوي على قيمة معينة
استخدم القائمة
uselist المنطقية الثابتة العامة (string [] arr ، string targetvalue) {return arrays.aslist (arr) .Contains (targetValue) ؛}باستخدام مجموعة
useet useet static static static (string [] arr ، string targetValue) {set <string> set = new hashset <string> (Arrays.aslist (arr)) ؛ إرجاع set.contains (TargetValue) ؛}استخدم الحكم الحلقة
public static boolean useloop (string [] arr ، string targetValue) {for (string s: arr) {if (s.equals (targetValue)) return true ؛ } إرجاع خطأ ؛}استخدم Arrays.BinarySearch ()
لا يمكن استخدام طريقة Arrays.binarySearch() . ! ! إذا تم ترتيب الصفيف ، فستكون النتيجة غريبة للغاية.
إن استخدام العثور على ما إذا كان الصفيف المطلوب يحتوي على قيمة معينة على النحو التالي:
usearraysbinarysearch static boolean الثابت (string [] arr ، string targetValue) {int a = arrays.binarySearch (arr ، targetValue) ؛ إذا (أ> 0) العودة صحيح ؛ عودة أخرى خاطئة ؛}تعقيد الوقت
يمكن أن يرسم الرمز التالي تقريبًا تكلفة الوقت للطرق المختلفة. الفكرة الأساسية هي إيجاد قيمة معينة من صفيف ، وأحجام الصفيف هي 5 و 1K و 10K على التوالي. قد لا تكون النتائج التي تم الحصول عليها بواسطة هذه الطريقة دقيقة ، ولكنها أبسط وأوضح طريقة.
public static void main (string [] args) {string [] arr = new string [] {"cd" ، "bc" ، "ef" ، "de" ، "ab"} ؛ // استخدام قائمة long startTime = system.nanotime () ؛ لـ (int i = 0 ؛ i <100000 ؛ i ++) {uselist (arr ، "a") ؛ } long endtime = system.nanotime () ؛ مدة طويلة = endtime - وقت البدء ؛ System.out.println ("uselist:" + المدة / 1000000) ؛ // استخدم set startTime = system.nanotime () ؛ لـ (int i = 0 ؛ i <100000 ؛ i ++) {useet (arr ، "a") ؛ } endtime = system.nanotime () ؛ المدة = endtime - وقت البدء ؛ System.out.println ("useet:" + المدة / 1000000) ؛ // استخدم loop startTime = system.nanotime () ؛ لـ (int i = 0 ؛ i <100000 ؛ i ++) {useloop (arr ، "a") ؛ } endtime = system.nanotime () ؛ المدة = endtime - وقت البدء ؛ System.out.println ("useloop:" + المدة / 1000000) ؛ // استخدام المصفوفات. لـ (int i = 0 ؛ i <100000 ؛ i ++) {UseArraySbinarySearch (arr ، "a") ؛ } endtime = system.nanotime () ؛ المدة = endtime - وقت البدء ؛ System.out.println ("UseArrayBinary:" + المدة / 1000000) ؛}نتائج التشغيل:
USELIST: 13 USESET: 72USELOOP: 5 USEARRAYSBIRNINALSERESS: 9
استخدم مجموعة من الطول 1K
string [] arr = new string [1000] ؛ عشوائي s = جديد عشوائي () ؛ لـ (int i = 0 ؛ i <1000 ؛ i ++) {arr [i] = string.valueof (s.nextint ()) ؛}نتيجة:
USELIST: 112 USESESET: 2055USELOOP: 99USEARRAYBINALINAL: 12
استخدم مجموعة من الطول 10K
string [] arr = new string [10000] ؛ عشوائي s = new random () ؛ for (int i = 0 ؛ i <10000 ؛ i ++) {arr [i] = string.valueof (s.nextint ()) ؛}نتيجة:
USELIST: 1590USESET: 23819USELOOP: 1526SearRaybinary: 12
ملخص
من الواضح أن استخدام طريقة حلقة بسيطة أكثر كفاءة من استخدام أي مجموعة. يستخدم العديد من المطورين الطريقة الأولى للراحة ، لكن كفاءتهم منخفضة نسبيًا. نظرًا لأنك تضغط على صفيف في نوع المجموعة ، يجب عليك أولاً اجتياز عناصر الصفيف ثم استخدام فئة التجميع للقيام بعمليات أخرى.
إذا كنت تستخدم طريقة Arrays.binarySearch() . نظرًا لأن الصفيف أعلاه لم يتم فرزه ، فإن هذه الطريقة غير متوفرة.
في الواقع ، إذا كنت بحاجة إلى استخدام صفائف أو فئات التجميع للتحقق من كفاءة ما إذا كانت الصفيف تحتوي على قيمة محددة ، فيمكن أن تحقق قائمة أو شجرة مرتبة تعقيدًا للوقت من O (log (n)) ، ويمكن أن تحقق Hashset O (1).
باستخدام ArrayUtils
بالإضافة إلى ما سبق ، توفر مكتبة فئة Apache Commons أيضًا فئة ArrayUtils ، والتي يمكن أن تستخدم طريقة تحتوي على طريقة للحكم على العلاقة بين المصفوفات والقيم.
استيراد org.apache.commons.lang3.arrayutils ؛ public boolean usearrayutils (سلسلة [] arr ، string targetvalue) {return arrayutils.contains (arr ، targetValue) ؛}تم إجراء نفس الاختبار باستخدام صفائف من الأطوال المذكورة أعلاه ، وكانت النتيجة أن كفاءة هذه الطريقة كانت بين استخدام المجموعات واستخدام أحكام الحلقة (في بعض الأحيان كانت النتيجة أكثر مثالية من استخدام الحلقات).
USELIST: 323 USESESET: 3028USELOOP: 141SearRayBinary: 12USEARRAYUTILS: 181 ---------- uselist: 3703USESET: 35183USELOOP: 3218USEARRAYBININAL: 14USEARRAYUTILS: 3125
في الواقع ، إذا نظرت إلى مدونة المصدر الخاصة بـ ArrayUtils.consains ، فيمكنك أن تجد أنها في الواقع وسيلة للحكم على ما إذا كان هناك عنصر مدرج في صفيف.
بعض الرموز هي كما يلي:
if (Array == null) {return -1 ؛ } آخر {if (startIndex <0) {startIndex = 0 ؛ } int i ؛ if (objectTofInd == null) {for (i = startIndex ؛ i <array.length ؛ ++ i) {if (Array [i] == null) {return i ؛ }}} آخر إذا (array.getClass (). getComponentType (). isInstance (ObjectTofInd)) {for (i = startIndex ؛ i <array.length ؛ ++ i) {if (objectTofInd.equals (array [i])) {return i ؛ }}} return -1 ؛ }وبالمقارنة ، أفضل استخدام فئة أدوات ArrayUtils لأداء بعض العمليات المتعلقة بأسلاف العدد المشترك. بعد كل شيء ، يمكنه السماح لي أن أكتب الكثير من التعليمات البرمجية (لأن هناك حتماً من الأخطاء عند كتابة رمز بنفسي. بعد كل شيء ، تم اختبار مكتبة أدوات المصدر المفتوحة التي يوفرها Apache بواسطة عدد لا يحصى من المطورين) ، والكفاءة ليست أقل بكثير.
لخص
حسنًا ، ما سبق هو كل شيء عن هذا المقال. آمل أن يكون محتوى هذه المقالة من بعض المساعدة للجميع تعلم أو استخدام Java. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل.