USACO训练页面你的骑行在这里ArrayList IndexOutOfBounds错误

时间:2015-12-19 22:05:01

标签: java

问题: 你的骑行在这里

众所周知,每个好彗星背后都是不明飞行物。这些不明飞行物经常来自地球上的忠实支持者。不幸的是,他们在每次旅行中只有空间来接一组粉丝。然而,他们确实让团队提前知道将通过一个聪明的方案为每颗彗星拾取:他们为彗星选择一个名称,以及该组的名称,可以用来确定它是否是一个特定的团体转向(你认为谁是彗星的名字?)。匹配方案的细节如下:你的工作是编写一个程序,它取一个组和一个彗星的名字,然后确定该组是否应该使用该彗星后面的UFO。

组的名称和彗星的名称都按以下方式转换为数字:最终的数字只是名称中所有字母的乘积,其中“A”是1和“Z”例如,组“USACO”将是21 * 19 * 1 * 3 * 15 = 17955.如果组的数字mod 47与彗星的数字mod 47相同,那么你需要告诉小组得到准备! (请记住,“a mod b”是除以b后剩余的余数; 34 mod 10为4.)

写一个程序,它读入彗星的名称和组的名称,并根据上述方案确定名称是否匹配,如果匹配则打印“GO”,否则打印“STAY”。组和彗星的名称将是一串大写字母,没有空格或标点符号,最多6个字符。

以下是我的问题代码:

import java.io.*;
import java.util.*;

public class ride {

public static void main(String[] args) throws IOException {
    BufferedReader f = new BufferedReader(new FileReader("ride.in"));
    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("ride.out")));


    ArrayList<String> inputs = new ArrayList<String>(10);

    StringTokenizer st = new StringTokenizer(f.readLine());
    for (int i=0; i<5; i++)
    {
        inputs.set(i, st.nextToken());
    }

    ArrayList<String> inputs2 = new ArrayList<String>(10);

    st = new StringTokenizer(f.readLine());
    for (int j=0; j<5; j++)
    {
        inputs2.set(j, st.nextToken());
    }

    String[] alphabet = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};

    ArrayList<String> alphabet2 = new ArrayList<String>(30);
    {
        for (int a = 0; a<alphabet.length; a++)
        {
            alphabet2.set(a, alphabet[a]);
        }
    }

    int product1 = 1;
    for (int k=0; k<inputs.size(); k++)
    {
        String letter = inputs.get(k);
        product1 = product1*(alphabet2.indexOf(letter)+1);

    }

    int product2 = 1;
    for (int l=0; l<inputs2.size(); l++)
    {
        String letter2 = inputs2.get(l);
        product2 = product2*(alphabet2.indexOf(letter2)+1);

    }

    if (product1%47 == product2%47)
    {
        out.print("GO");
    }


    else
    {
        out.print("STAY");
    }

    out.close();
    f.close(); 


}

}

然而,当我运行此时,评分者返回:

  

运行1:执行错误:程序退出,退出状态为“1”。

    ------ Data for Run 1 [length=14 bytes] ------
    COMETQ 
    HVNGAT 
    ----------------------------

      Your program printed data to stderr.  Here is the data:
      -------------------
      Exception_in_thread_"main"_java.lang.IndexOutOfBoundsException:_Index:_0,_Size:_0
        at_java.util.ArrayList.RangeCheck(ArrayList.java:547)
        at_java.util.ArrayList.set(ArrayList.java:337)
        at_ride.main(Unknown_Source)
      -------------------

任何人都可以帮助指出我的问题吗?

1 个答案:

答案 0 :(得分:0)

set上的List方法需要there already be an element at the index before the set is called for that index

因此,在空列表中执行set时,此代码正在破坏:

ArrayList<String> inputs = new ArrayList<String>(10);

StringTokenizer st = new StringTokenizer(f.readLine());
for (int i=0; i<5; i++)
{
    inputs.set(i, st.nextToken());
}

更合适的使用方法是add

ArrayList<String> inputs = new ArrayList<String>(10);

StringTokenizer st = new StringTokenizer(f.readLine());
for (int i=0; i<5; i++)
{
    inputs.add(i,st.nextToken());
}