java - يتكرر من خلال مجموعة سلسلة في جاوة



arrays collections (8)

لدي مصفوفة سلسلة مع بعض المكونات ، هذه المجموعة لديها 5 مكونات وتختلف في بعض الأحيان. ما أود القيام به هو التكرار من خلال هذا الصفيف والحصول على المكون الأول والمكون بجانب ذلك. لذا في المرة الأولى التي أحصل فيها على المكون رقم واحد والمكون رقم 2 ، فإن المرة الثانية ستحصل على الرقم 2 و 3 ، والثالثة رقم 3 و 4 ... وهكذا حتى تصل إلى آخر مكون.

هذا مدى قدومي:

String[] elements = { "a", "a","a","a" };

for( int i = 0; i <= elements.length - 1; i++)
{
    // get element number 0 and 1 and put it in a variable, 
    // and the next time get element      1 and 2 and put this in another variable. 
}

كيف يمكنني تحقيق ذلك؟


Answers

String[] elements = { "a", "a", "a", "a" };

for( int i = 0; i < elements.length - 1; i++)
{
    String element = elements[i];
    String nextElement = elements[i+1];
}

لاحظ أنه في هذه الحالة ، يكون elements.length هو 4 ، لذا تريد التكرار من [0,2] للحصول على العناصر 0,1 و 1,2 و 2,3 .


String current = elements[i];
if (i != elements.length - 1) {
   String next = elements[i+1];
}

هذا يجعل متأكد من عدم الحصول على ArrayIndexOutOfBoundsException لعنصر آخر (لا يوجد 'التالي' هناك). الخيار الآخر هو التكرار إلى i < elements.length - 1 . ذلك يعتمد على الاحتياجات الخاصة بك.


String[] elements = { "a", "a","a","a" };

for( int i=0; i<elements.length-1; i++)
{
    String s1 = elements[i];
    String s2 = elements[i+1];
}

فقط للإضافة إلى الإجابات المذكورة أعلاه أو أسفلها ، يمكنك تنفيذ حلقة مُحسّنة For-Loop (لـ Java 5 أو أعلى) للتكرار على عناصر المصفوفة:

String[] elements = { "a","a","a","a" };   
for (String s: elements) {           
        //Do your stuff here
        System.out.println(s); 
    }

أنا أزعم بدلا من اختبار i أقل من elements.length - 1 اختبار i + 1 أقل من elements.length . لا تقوم بتغيير نطاق الصفيف الذي تبحث عنه (أي تجاهل العنصر الأخير) ، بل تغيير العنصر الأعظم الذي تبحث عنه في كل عملية تكرار.

String[] elements = { "a", "a","a","a" };

for(int i = 0; i + 1 < elements.length; i++) {
    String first = elements[i];
    String second = elements[i+1];
    //do something with the two strings
}

هذه الخوارزميات غير صحيحة بسبب المقارنة:

لـ (int i = 0؛ i> elements.length - 1؛ i ++)

أو

لـ (int i = 0؛ i + 1 <elements.length؛ i ++) {

صحيح أن عناصر الصفيف تتراوح من 0 إلى length - 1 ، لكن المقارنة في هذه الحالة يجب أن تكون less than or equal to . يجب أن تكون:

لـ (int i = 0؛ i <elements.length؛ i ++) {

أو

لـ (int i = 0؛ i <= elements.length - 1؛ i ++) {

أو

ل (int i = 0؛ i + 1 <= elements.length؛ i ++) {

المصفوفة ["a", "b"] قد تتكرر كما يلي:

i = 0 هو <2: عناصر [0] تنتج "a"

i = 1 هي <2: العناصر [1] الإنتاجية "b"

ثم الخروج من الحلقة لأن 2 ليست <2.

الأمثلة غير الصحيحة الخروج من الحلقة قبل الأوان وتنفيذ فقط مع العنصر الأول في هذه الحالة البسيطة من عنصرين.


    String[] nameArray= {"John", "Paul", "Ringo", "George"};
    int numberOfItems = nameArray.length;
    for (int i=0; i<numberOfItems; i++)
    {
        String name = nameArray[i];
        System.out.println("Hello " + name);
    }

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

على سبيل المثال ، هذا الحل يعمل بشكل جيد للوضع الذي أستخدم فيه (ولكن من الواضح أنه لا يمكن الاعتماد عليه في جميع الحالات ...)

 /**
 * A quick and dirty way to determine whether the passed in array is associative or not, assuming that either:<br/>
 * <br/>
 * 1) All the keys are strings - i.e. associative<br/>
 * or<br/>
 * 2) All the keys are numeric - i.e. not associative<br/>
 * 
 * @param array $objects
 * @return boolean
 */
private function isAssociativeArray(array $objects)
{
    // This isn't true in the general case, but it's a close enough (and quick) approximation for the context in
    // which we're using it.

    reset($objects);
    return count($objects) > 0 && is_string(key($objects));
}




java arrays collections