使用ArrayList时解析ArrayIndexOutOfBoundException

时间:2013-08-23 09:30:33

标签: java

我是java开发领域的初学者,我仍然是Java编程的学习者。我想在netbeans IDE上看到支持向量机分类器的输出。所以我复制了这段附加的代码并试图通过使用所有其他必需的类和main方法来运行,但是当我给出包含23,25,26,27之类的输入的文件时,我得到Number format exception在main方法中调用方法loadBinaryProblem(),如果我删除所有逗号并用空格ex:23 25 26 27替换它们,那么我将获得ArrayIndexOutOfBound异常而不是它。所以任何人都可以帮助正确地获得输出而没有任何错误。

package svmlearn;

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

/**
 * Class representing an optimization problem (a data setting);
 * taken from liblinear; "bias" excluded
 * @author miafranc
 *
 */
public class Problem {
        /** The number of training data */
        public int l;
        /** The number of features (including the bias feature if bias >= 0) */
        public int n;
        /** Array containing the target values */
        public int[] y;
        /** Map of categories to allow various ID's to identify classes with. */
        public CategoryMap<Integer> catmap;
        /** Array of sparse feature nodes */
        public FeatureNode[][] x;
        public Problem() {
                l = 0;
                n = 0;
                catmap = new CategoryMap<Integer>();
        }
        /**
         * Loads a binary problem from file, i.e. having 2 classes.
         * @param filename The filename containing the problem in LibSVM format.
         */
        public void loadBinaryProblem(String filename) {
                String row;
                ArrayList<Integer> classes = new ArrayList<Integer>();
                ArrayList<FeatureNode []> examples = new ArrayList<FeatureNode []>();
                try {
                        BufferedReader r = new BufferedReader(new FileReader(filename));
                        while ((row = r.readLine()) != null) {
                                String [] elems = row.split(" ");
                                //Category:
                                Integer cat = Integer.parseInt(elems[0]);
                                catmap.addCategory(cat);
                                if (catmap.size() > 2) {
                                        throw new IllegalArgumentException("only 2 classes allowed!");
                                }
                                classes.add(catmap.getNewCategoryOf(cat));
                                //Index/value pairs:
                                examples.add(parseRow(elems));
                        }
                        x = new FeatureNode[examples.size()][];
                        y = new int[examples.size()];
                        for (int i=0; i<examples.size(); i++) {
                                x[i] = examples.get(i);
                                y[i] = 2*classes.get(i)-1; //0,1 => -1,1
                        }
                        l = examples.size();
                } catch (Exception e) {
                        System.out.println(e);
                }
        }
        /**
         * Parses a row from a LibSVM format file.
         * @param row The already split row on spaces.
         * @return The corresponding FeatureNode.
         */
        public FeatureNode [] parseRow(String [] row) {
                FeatureNode [] example = new FeatureNode[row.length-1];
                int maxindex = 0;
                for (int i=1; i<row.length; i++) {
                        String [] iv = row[i].split(":");
                        int index = Integer.parseInt(iv[0]);
                        if (index <= maxindex) {
                                throw new IllegalArgumentException("indices must be in increasing order!");
                        }
                        maxindex = index;
                        double value = Double.parseDouble(iv[1]);
                        example[i-1] = new FeatureNode(index, value);
                }
                if (n < maxindex)
                        n = maxindex;
                return example;
        }
}

1 个答案:

答案 0 :(得分:4)

我猜NumberformatExceptions来自:

String [] elems = row.split(" "); //nothing done by "23,25,26,27"
//Category:
Integer cat = Integer.parseInt(elems[0]); //you are trying to parse "23,25,26,27"

ArrayIndexOutOfBound来自:

String [] iv = row[i].split(":");//nothing done
...
double value = Double.parseDouble(iv[1]);//1 is out of bound