รับดัชนีอาเรย์ 2 มิติจาก 1D

ดังนั้นฉันจึงพยายามวนซ้ำองค์ประกอบทั้งหมดในอาร์เรย์ 2 มิติโดยใช้ลูปเดียว

ฉันอยู่ที่ไหน:

public class Test {
    private static final String[][] key = {
        {"`", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", "Backspace"}, // 0 - 13
        {"Tab", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "[", "]", "\\"},      // 0 - 13
        {"Caps", "A", "S", "D", "F", "G", "H", "J", "K", "L", ";", "'", "Enter"},       // 0 - 12
        {"Shift", "Z", "X", "C", "V", "B", "N", "M", ",", ".", "/", "\u2191"},          // 0 - 11
        {" ", "<", "\u2193", ">"}                                                       // 0 - 3
    };

    public static void main(String[] args) {
        final int totalLen = 57;
        String str = "";

        for (int i = 0, row = 0, col = 0; i < totalLen; ++i, ++col) {

            if (row < key.length && i % key[row].length >= key[row].length - 1) {
                ++row;
                col = 0;
                System.out.println(str);
                str = "";
            }

            if (row < key.length)
                str += col + " ";
        }
    }
}

ฉันได้แสดงความคิดเห็นเกี่ยวกับช่วงดัชนีสำหรับแต่ละแถวที่โปรแกรมด้านบนควรส่งออก แต่ไม่ได้เป็นเพราะตรรกะมีข้อผิดพลาด มีข้อเสนอแนะอะไรบ้าง?

แก้ไข: เงื่อนไขการวนซ้ำจะต้องเหมือนเดิม


person Community    schedule 13.07.2014    source แหล่งที่มา
comment
การใช้เลขอาถรรพ์ (57) มีประโยชน์อะไรกับการยืนกรานต่อเงื่อนไขต้องคงเดิม? ความสามารถในการอ่านและการบำรุงรักษาไม่ดี... จะเกิดอะไรขึ้นหากจำนวนองค์ประกอบไม่ใช่ 57 คาดหวังข้อยกเว้น!?   -  person laune    schedule 13.07.2014
comment
ฉันอธิบายเหตุผลในความคิดเห็นต่อคำตอบข้อใดข้อหนึ่ง 57 ไม่ใช่ตัวเลขมหัศจรรย์ แต่เป็นจำนวนองค์ประกอบทั้งหมดในอาร์เรย์ i ถูกใช้เป็นดัชนีสำหรับอาร์เรย์อื่นที่ไม่เกี่ยวข้องที่นี่   -  person    schedule 13.07.2014
comment
@laune แก้ไข: จะเกิดอะไรขึ้นถ้าจำนวนองค์ประกอบไม่ใช่ 57 คาดหวังข้อยกเว้น!? ก่อนอื่นคุณต้องทำใจให้สบายสักหน่อย จำนวนองค์ประกอบได้รับการคำนวณก่อนหน้านี้ ดังนั้นจึงเป็นไปไม่ได้ที่จะไม่เป็น 57 ฉันตัดรายละเอียดที่ไม่เกี่ยวข้องออกจากตัวอย่างแล้ว   -  person    schedule 13.07.2014
comment
ฉันประหลาดใจที่ OP ยืนกรานที่จะรักษาเงื่อนไขการวนซ้ำที่ไม่เป็นธรรมชาติ โดยตั้งค่าสุดท้าย (totalLen) เป็นค่าที่คำนวณไว้ก่อนหน้านี้ นั่นคือ ก่อนเวลาคอมไพล์   -  person laune    schedule 14.07.2014
comment
ทำไมคุณถึงคิดว่ามันเป็นเวลาก่อนเวลารวบรวม? ก่อนหน้านี้ก็เคยใช้วิธีนี้ ฉันเขียนลูปเพื่อนับมันแล้วเก็บไว้ -- รันไทม์ ฉันไม่จำเป็นต้องเกะกะคำถามโดยรวมการวนซ้ำนั้น ฉันแค่ประหลาดใจกับความตรึงอยู่กับสภาพของคุณ   -  person    schedule 15.07.2014
comment
ฉันประหลาดใจที่ยืนกรานในเงื่อนไขลูปนี้เพราะฉันไม่เห็นความจำเป็นหรือประโยชน์ของมัน   -  person laune    schedule 15.07.2014


คำตอบ (3)


ลองใช้วิธีแก้ปัญหานี้ โดยใช้ while ลูปเดียวและเงื่อนไขลูปเดียวกันจากคำถาม (ตามที่ร้องขอ):

String str = "";
int row = 0, col = 0;
int i = 0, totalLen = 57;

while (i < totalLen) {
    if (col < key[row].length) {
        str += col++ + " ";
        i++;
    } else {
        System.out.println(str);
        str = "";
        row++;
        col = 0;
    }
}
System.out.println(str); // prints the last line

หรือหากคุณต้องการใช้ลูป for:

String str = "";
int totalLen = 57;

for (int i = 0, row = 0, col = 0; i < totalLen; i++) {
    str += col++ + " ";
    if (col == key[row].length) {
        row++;
        col = 0;
        System.out.println(str);
        str = "";
    }
}

ตัวอย่างข้อมูลอย่างใดอย่างหนึ่งจะสร้างเอาต์พุตต่อไปนี้บนคอนโซล:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 
0 1 2 3 4 5 6 7 8 9 10 11 12 13 
0 1 2 3 4 5 6 7 8 9 10 11 12 
0 1 2 3 4 5 6 7 8 9 10 11 
0 1 2 3
person Óscar López    schedule 13.07.2014

คุณควรจะสามารถทำได้ด้วยตัวแปรสองตัว row และ col โดยที่ col เพิ่มขึ้นในส่วนหัวของลูป และ row เพิ่มขึ้นอย่างมีเงื่อนไขในตัวของลูป:

for (int row =0, col = 0 ; row != key.length ; col++) {
    System.out.println(row + " " + col);
    if (col == key[row].length-1) {
        row++;
        col = 0;
    }
}

เงื่อนไขการวนซ้ำไม่สามารถแตกต่างได้ ขออภัย ฉันลืมพูดถึงเรื่องนั้น

คุณสามารถเพิ่ม i และหยุดเมื่อถึง totalLen ได้เช่นกัน:

for (int row =0, col = 0, i = 0 ; i != totalLen ; col++, i++) {
    System.out.println(row + " " + col);
    if (col == key[row].length-1) {
        row++;
        col = 0;
    }
}

อย่างไรก็ตาม สิ่งนี้จะเปราะบางกว่า เนื่องจากคุณได้รับการพึ่งพาจากการคำนวณ totalLen อย่างถูกต้อง

person Sergey Kalinichenko    schedule 13.07.2014
comment
โซลูชันทั้งสองพิมพ์ผลลัพธ์ที่ไม่ถูกต้อง รหัสของ OP ตั้งใจที่จะสร้างค่า col สำหรับแต่ละแถว ดูคำตอบของฉัน - person Óscar López; 13.07.2014

ตกลง ฉันพยายามรักษาสภาพลูปของคุณเหมือนเดิม... แต่ฉันไม่ได้ใช้ทุกพารามิเตอร์ อย่างไรก็ตาม มันควรจะได้ผล:

for (int i = 0, row = 0, col = 0; i < totalLen; ++i, ++col) {
    System.out.println("row " + row + ", col " + col);
    // what ever you want to do with your loop, do it here
    // before altering the row and col parameters

    if (col == key[row].length-1) {
        col = -1;   // if end of the row, set col to -1, it will be incremented in the next loop
        row++;
        if(row==key.length){
            break;
        }
    }
}

โดยพื้นฐานแล้วมันเกือบจะเหมือนกับที่ @dasblinkenlight ทำ - มีเพียงฉันเท่านั้นที่แนะนำเงื่อนไข break เมื่อตัวแปร row ถึงความยาวของอาร์เรย์ key คุณสามารถทดสอบ if(i==totalLen) ได้ด้วย แต่โดยส่วนตัวแล้วฉันคิดว่าการตรวจสอบความยาวของอาเรย์นั้นเชื่อถือได้มากกว่า

person GameDroids    schedule 13.07.2014
comment
@ user2570380 คุณถูกต้องแล้ว ฉันแก้ไขแล้ว ขอโทษ - person GameDroids; 14.07.2014