題目描述

有時候使用動態改變大小的陣列是不錯的方法。Java的Arraylist類別提供了動態陣列的功能,請嘗試使用Arraylist來解決這個問題。



您將會得到N行資料。每行資料包含0個或是0個以上的整數。接著您需要進行一些查詢,來取得第x行、第y個位置的整數。

資料將會從標準輸入串流中輸入。

原題網址

https://www.hackerrank.com/challenges/java-arraylist

輸入格式

第一行輸入一個整數n,範圍在1到20000之間(包含1和20000)。接下來的n行每行會有一個整數d和d個用空格隔開的整數,d的範圍在0到50000之間(包含0和50000)。緊接的下一行有一個整數q,範圍在1到1000之間(包含1和1000),代表查詢的次數。再接下來的q行每行包含x和y兩個整數數字,x和y的範圍在1到n之間(包含1和n)。n行中d個整數的數量總合不會超過100000。

輸出格式

分行輸出每一行查詢的結果,如果查詢位置的元素不存在,輸出「ERROR!」。

範例輸入

5
5 41 77 74 22 44
1 12
4 37 34 36 52
0
3 20 22 33
5
1 3
3 4
3 1
4 3
5 5

範例輸出

74
52
37
ERROR!
ERROR!

解題概念

利用ArrayList>這樣的資料結構來練習ArrayList的用法。先建立一個可以存放ArrayList元素的ArrayList物件,再利用輸入的資料建立出n個可以存放Integer元素的ArrayList物件,再將這些可以存放Integer元素的ArrayList物件存進可以存放ArrayList元素的ArrayList物件中來完成二維陣列的概念。

參考答案

import java.util.ArrayList;
import java.util.Scanner;

public class Solution {

    public static void main(final String[] args) {

        final Scanner sc = new Scanner(System.in);
        final int n = sc.nextInt();
        final ArrayList<ArrayList<Integer>> listArray = new ArrayList<>();
        for (int i = 0; i < n; ++i) {
            final ArrayList<Integer> list = new ArrayList<>();
            listArray.add(list);
            final int d = sc.nextInt();
            for (int j = 0; j < d; ++j) {
                list.add(sc.nextInt());
            }
        }
        final int q = sc.nextInt();
        final StringBuilder sb = new StringBuilder();
        for (int i = 0; i < q; ++i) {
            final int x = sc.nextInt(), y = sc.nextInt();
            try {
                sb.append(listArray.get(x - 1).get(y - 1));
            } catch (final Exception ex) {
                sb.append("ERROR!");
            }
            sb.append("\n");
        }
        System.out.println(sb.toString().trim());
    }
}