كيف يمكنك اختبار معرفة ما إذا كان هناك صفيفان متماثلان باستخدام CFML؟

StackOverflow https://stackoverflow.com/questions/30288

  •  09-06-2019
  •  | 
  •  

سؤال

باستخدام CFML (ColdFusion Markup Langauge، المعروف أيضًا باسم ColdFusion)، كيف يمكنك المقارنة إذا كانت صفيفتان ذات بعد واحد متماثلتين؟

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

المحلول

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

<cfif arrayToList(arrayA) IS arrayToList(arrayB)>
    Arrays are equal!
</cfif>

ليست أنيقة مثل الحلول الأخرى المقدمة، ولكنها بسيطة للغاية.

نصائح أخرى

هناك طريقة بسيطة جدًا لمقارنة صفيفين باستخدام لغة Java الأساسية لـ CFML.وفقًا لمدونة حديثة كتبها روبيش كومار من شركة Adobe (http://coldfused.blogspot.com/)، تعتبر صفائف ColdFusion تطبيقًا لقوائم Java (java.util.List).لذا فإن جميع طرق قائمة Java متاحة لمصفوفات CFML.

لذا، لمقارنة مصفوفتين، كل ما عليك فعله هو استخدام طريقة التساوي.تقوم بإرجاع نعم إذا كانت المصفوفات متساوية و لا إذا لم تكن كذلك.

<cfset array1 = listToArray("tom,dick,harry,phred")/>
<cfset array2 = listToArray("dick,harry,phred") />
<cfset array3 = listToArray("tom,dick,harry,phred")/>

<cfoutput>
Array2 equals Array1 #array2.equals(array1)# (returns a NO) <br/>
Array3 equals Array1 #array3.equals(array1)# (returns a YES) <br/>
</cfoutput>

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

<cfsilent>
    <!--- create some semi-complex test data --->
    <cfset data = StructNew() />
    <cfloop from="1" to="50" index="i">
        <cfif variables.i mod 2 eq 0>
            <cfset variables.data[variables.i] = StructNew()/>
            <cfset tmp = variables.data[variables.i] />
            <cfloop from="1" to="#variables.i#" index="j">
                <cfset variables.tmp[variables.j] = 1 - variables.j />
            </cfloop>
        <cfelseif variables.i mod 3 eq 0>
            <cfset variables.data[variables.i] = ArrayNew(1)/>
            <cfset tmp = variables.data[variables.i] />
            <cfloop from="1" to="#variables.i#" index="j">
                <cfset variables.tmp[variables.j] = variables.j mod 6 />
            </cfloop>
            <cfset variables.data[variables.i] = variables.tmp />
        <cfelse>
            <cfset variables.data[variables.i] = variables.i />
        </cfif>
    </cfloop>
</cfsilent>

<cftimer label="JSON" type="inline">
    <cfset jsonData = serializeJson(variables.data) />
    <cfset jsonHash = hash(variables.jsonData) />
    <cfoutput>
        JSON: done.<br />
        len=#len(variables.jsonData)#<br/>
        hash=#variables.jsonHash#<br />
    </cfoutput>
</cftimer>
<br/><br/>
<cftimer label="WDDX" type="inline">
    <cfwddx action="cfml2wddx" input="#variables.data#" output="wddx" />
    <cfset wddxHash = hash(variables.wddx) />
    <cfoutput>
        WDDX: done.<br />
        len=#len(variables.wddx)#<br/>
        hash=#variables.wddxHash#<br />
    </cfoutput>
</cftimer>

إليك الإخراج الذي ينشئه الكود أعلاه على جهازي:

JSON: done.
len=7460
hash=5D0DC87FDF68ACA4F74F742528545B12
JSON: 0ms

WDDX: done.
len=33438
hash=94D9B792546A4B1F2FAF9C04FE6A00E1
WDDX: 47ms

على الرغم من أن بنية البيانات التي أقوم بتسلسلها معقدة إلى حد ما، إلا أنه يمكن اعتبارها صغيرة بسهولة.وهذا من شأنه أن يجعل كفاءة تسلسل JSON عبر WDDX أكثر تفضيلاً.

على أي حال، إذا كنت سأحاول كتابة طريقة "compareAnything" باستخدام مقارنة التجزئة، فسأستخدم تسلسل JSON عبر WDDX.

يجب أن تقوم الدالة arrayCompare()‎ المعرفة من قبل المستخدم في cflib بذلكhttp://cflib.org/index.cfm?event=page.udfbyid&udfid=1210

من المؤكد أن إجابة جيسون هي الأفضل، ولكن الشيء الذي قمت به من قبل هو إجراء مقارنة التجزئة على الكائنات التي تم تسلسلها إلى WDDX.

هذه الطريقة مفيدة فقط للمصفوفات الصغيرة نسبيًا، ولكنها خيار آخر إذا كنت تريد الاحتفاظ بها بتنسيق CFML فقط.كما أن له فائدة أنه يمكنك تطبيق الطريقة على أنواع البيانات الأخرى أيضًا...

يحرر:آدامز على حق تمامًا (كما ترون من أرقامه) - JSON أكثر اقتصادا، ليس فقط في هذه الحالة، ولكن أيضًا للتسلسل بشكل عام.في دفاعي، أنا عالق في استخدام CFMX 6.1 الذي لا يحتوي على وظائف JSON يحمل في ثناياه عوامل، وكنت أحاول تجنب libs الخارجية.

كنت أبحث في استخدام كائنات Java الأصلية الخاصة بـ CF منذ فترة طويلة، وذكرني هذا السؤال ببعض منشورات المدونة التي قمت بوضع إشارة مرجعية عليها نتيجة لبحثي.

مجموعة ColdFusion هي في الواقع تطبيق لقائمة جافا (java.util.List).لذا فإن جميع أساليب القائمة متاحة بالفعل لـ Array.يوفر CF معظم وظائف القائمة باستخدام وظائف Array ولكن هناك القليل من الأشياء الممكنة باستخدام قائمة Java والتي لا يمكنك القيام بها مباشرة باستخدام وظائف CF.

  1. دمج صفيفين
  2. إلحاق مصفوفة في منتصف مصفوفة أخرى
  3. البحث عن عنصر في مصفوفة
  4. ابحث في المصفوفة 1 لمعرفة ما إذا تم العثور على جميع عناصر المصفوفة 2
  5. فحص المساواة
  6. إزالة العناصر في الصفيف 1 من الصفيف 2

من: http://coldfused.blogspot.com/2007/01/extend-cf-native-objects-harnessing.html

هناك مورد آخر وجدته يوضح كيف يمكنك استخدام فئة Java Array الأصلية للحصول على قيم فريدة وإنشاء وظائف فرز مخصصة في حالة احتياجك إلى فرز مجموعة من التواريخ، على سبيل المثال.

http://www.barneyb.com/barneyblog/2008/05/08/use-coldfusion-use-java/

يحتوي هذا الرابط الثاني على روابط لمنشورات أخرى حيث يوضح المؤلف كيفية استخدام فئات Java الأخرى محليًا للحصول على وظيفة أو سرعة عبر وظائف CF.

تتحقق كل هذه الحلول من تساوي صفيفين.لا يتحققون من أنهم نفس الكائن.الطريقة الوحيدة التي أعرفها للقيام بذلك في CF الأصلي هي تغيير الكائن بطريقة ما ومعرفة ما إذا كان كلا المرجعين يحتويان على التغيير.

أعتقد أيضًا أنه يجب عليك الحذر من الاعتماد على CF في تنفيذ فئات معينة من Java أو الكشف عن الأساليب.هذه عرضة للتغيير.

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

سيعمل هذا مع القيم البسيطة.

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