如何根据int数组检查迭代器号?

时间:2015-11-30 19:06:27

标签: java arrays csv

我有一个CSV文件,我正在尝试根据其在数组中的位置替换已知数据。

我已将CSV文件拆分为"拆分"阵列。拆分中需要更换的位置在"错误"阵列。

但是,我得到了if(error [i] == i)的ArrayIndexOutOfBounds异常。我知道这是因为split数组与错误数组的长度不同而产生错误。

这周围有吗?

while ((line = in.readLine()) != null) 
{
            String[] split = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", -1);
            StringBuilder sb = new StringBuilder();

            for(int i = 0; i < split.length; i++) 
            {

                int[] error = {0,1,2,3,4,7,8,9,10,11,15,21,34,37,57,61,65,68,69,71,75,79,82,83,85,89,93,96,97,99,103,107,110,111,113,117,121,124,125,127,128,129,130,132,182,210,212,213,214,215,216,222,226,239};
                String fix = "ignore_";

                if(error[i] == i){
                split[i] = fix + i;

            }

            sb.append(split[i]);

            if(i != split.length - 1)
            {
                sb.append(" ");
            }

        }

        String newline = sb.toString();
        printWriter.println(newline);
    }

} catch (Throwable t) 
{
    t.printStackTrace();
}

示例CSV:

"Start Date","End Date","Export App Name","Username","User Last Name",
"User First Name","Response ID","Response Date/Time","Device Date/Time",
"Submission Form Name","Submission Form Version"

此CSV文本根据格式拆分为数组。 &#34;开始日期&#34;是分裂数组的第一个元素,&#34;结束日期&#34;是第二个。

我想举例(基于前两个数字是错误数组)替换&#34;开始日期&#34;和&#34;结束日期&#34;无论我将String定义为什么定义。

因此,在完成循环之后,我希望我的输出为:

"ignore_1","ignore_2","Export App Name","Username","User Last Name",
"User First Name","Response ID","Response Date/Time","Device Date/Time",
"Submission Form Name","Submission Form Version"

2 个答案:

答案 0 :(得分:1)

NB:您可以在error循环之前使用while数组的声明,它会更好。

<强>解决方案:

  • 您还必须添加其他for循环以迭代error数组

for(int i = 0; i < split.length; i++) {内,就像那样:

    for(int j = 0; j < error.length; j++){

                    if(error[j] == i){
                       split[i] = fix;
                    }
        }

<强>解释

  • 对于i数组的每个索引(位置)split,将检查此索引(位置)是否与error数组中的元素相对应。

答案 1 :(得分:0)

使用HashSet存储感兴趣的列的一种可能性。 HashSet不是遍历查找值的数组,而是提供值的恒定时间查找。

HashSet<Integer> replace = new HashSet<Integer>(
    Arrays.asList(0,1)
);

while ((line = in.readLine()) != null) {
    String[] split = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", -1);

    for(int i = 0; i < split.length; i++) {
        if (replace.contains(i)) {
            // Do something with the column value.
        }
        else {
            // Leave as is. 
        }
    }
}