从csv文件加载数据时出现问题-Java

从csv文件加载数据时出现问题-Java,java,csv,Java,Csv,目前,我有一个.csv文件形式的数据集,您可以找到。还有一些简短的文档,你可以找到。我试图做的是操纵数据集,这样我就可以使用一些机器学习算法,但目前我似乎无法将输出的数据打印到控制台 ImageMatrix.java import java.util.Arrays; public class ImageMatrix { public static int[] data; public int classCode; public ImageMatrix(int[] da

目前,我有一个.csv文件形式的数据集,您可以找到。还有一些简短的文档,你可以找到。我试图做的是操纵数据集,这样我就可以使用一些机器学习算法,但目前我似乎无法将输出的数据打印到控制台

ImageMatrix.java

import java.util.Arrays;


public class ImageMatrix {
    public static int[] data;
    public int classCode;
    public ImageMatrix(int[] data, int classCode) {
        assert data.length == 64;

    }

    public String toString() {
        return "Class Code: " + classCode + " DataSet:" + Arrays.toString(data) + "\n";
    }

    public int[] getData() {
        return data;
    }

    public int getClassCode() {
        return classCode;
    }

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




public class ImageMatrixDB implements Iterable<ImageMatrix> {
    List<ImageMatrix> list = new ArrayList<ImageMatrix>();

    public static ImageMatrixDB load(String f) throws IOException {
        ImageMatrixDB result = new ImageMatrixDB();
        try (FileReader fr = new FileReader(f);
             BufferedReader br = new BufferedReader(fr)) {
            for (String line; null != (line = br.readLine()); ) {
                int lastComma = line.lastIndexOf(',');
                int classCode = Integer.parseInt(line.substring(1 + lastComma));
                int[] data = Arrays.stream(line.substring(0, lastComma).split(","))
                                   .mapToInt(Integer::parseInt)
                                   .toArray();
                result.list.add(new ImageMatrix(data, classCode));
            }
            System.out.println(ImageMatrix.data.toString());
        }
        return result;
    }



    public Iterator<ImageMatrix> iterator() {
        return this.list.iterator();
    }
    public static void main(String[] args){
        ImageMatrixDB i = new ImageMatrixDB();
        i.load("dataset1.csv"); // <<< ERROR IS HERE
    }
}
ImageMatrixDB.java

import java.util.Arrays;


public class ImageMatrix {
    public static int[] data;
    public int classCode;
    public ImageMatrix(int[] data, int classCode) {
        assert data.length == 64;

    }

    public String toString() {
        return "Class Code: " + classCode + " DataSet:" + Arrays.toString(data) + "\n";
    }

    public int[] getData() {
        return data;
    }

    public int getClassCode() {
        return classCode;
    }

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




public class ImageMatrixDB implements Iterable<ImageMatrix> {
    List<ImageMatrix> list = new ArrayList<ImageMatrix>();

    public static ImageMatrixDB load(String f) throws IOException {
        ImageMatrixDB result = new ImageMatrixDB();
        try (FileReader fr = new FileReader(f);
             BufferedReader br = new BufferedReader(fr)) {
            for (String line; null != (line = br.readLine()); ) {
                int lastComma = line.lastIndexOf(',');
                int classCode = Integer.parseInt(line.substring(1 + lastComma));
                int[] data = Arrays.stream(line.substring(0, lastComma).split(","))
                                   .mapToInt(Integer::parseInt)
                                   .toArray();
                result.list.add(new ImageMatrix(data, classCode));
            }
            System.out.println(ImageMatrix.data.toString());
        }
        return result;
    }



    public Iterator<ImageMatrix> iterator() {
        return this.list.iterator();
    }
    public static void main(String[] args){
        ImageMatrixDB i = new ImageMatrixDB();
        i.load("dataset1.csv"); // <<< ERROR IS HERE
    }
}
import java.io.*;
导入java.util.*;
公共类ImageMatrixDB实现了Iterable{
列表=新的ArrayList();
公共静态ImageMatrixDB加载(字符串f)引发IOException{
ImageMatrixDB结果=新ImageMatrixDB();
try(FileReader fr=新的FileReader(f);
BufferedReader br=新的BufferedReader(fr)){
for(字符串行;null!=(line=br.readLine());){
int lastcoma=line.lastIndexOf(',');
int classCode=Integer.parseInt(line.substring(1+lastcoma));
int[]data=Arrays.stream(line.substring(0,lastcoma).split(“,”))
.mapToInt(整数::parseInt)
.toArray();
添加(新的ImageMatrix(数据,类代码));
}
System.out.println(ImageMatrix.data.toString());
}
返回结果;
}
公共迭代器迭代器(){
返回此.list.iterator();
}
公共静态void main(字符串[]args){
ImageMatrixDB i=新的ImageMatrixDB();

i、 加载(“dataset1.csv”);//您的问题在
ImageMatrix
类中。 您从未在构造函数中设置
int[]data
。您有:

    public ImageMatrix(int[] data, int classCode) {
        assert data.length == 64;

    }
你需要:

    public ImageMatrix(int[] data, int classCode) {
        assert data.length == 64;
        this.data = data;
        this.classCode = classCode;
    }
以下是您的更新/完整/工作代码:

图像矩阵:

import java.util.*;

public class ImageMatrix {
    private int[] data;
    private int classCode;

public ImageMatrix(int[] data, int classCode) {
    assert data.length == 64;
    this.data = data;
    this.classCode = classCode;
}

    public String toString() {
        return "Class Code: " + classCode + " DataSet:" + Arrays.toString(data) + "\n";
    }

    public int[] getData() {
        return data;
    }

    public int getClassCode() {
        return classCode;
    }

}
ImageMatrixDB:

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

    public class ImageMatrixDB implements Iterable<ImageMatrix> {
        private List<ImageMatrix> list = new ArrayList<ImageMatrix>();

        public ImageMatrixDB load(String f) throws IOException {
            try (
                FileReader fr = new FileReader(f);
                BufferedReader br = new BufferedReader(fr)) {
                String line = null;

                while((line = br.readLine()) != null) {
                    int lastComma = line.lastIndexOf(',');
                    int classCode = Integer.parseInt(line.substring(1 + lastComma));
                    int[] data = Arrays.stream(line.substring(0, lastComma).split(","))
                                       .mapToInt(Integer::parseInt)
                                       .toArray();
                    ImageMatrix matrix = new ImageMatrix(data, classCode);
                    list.add(matrix);
                }
            }
            return this;
        }

        public void printResults(){
            for(ImageMatrix matrix: list){
                System.out.println(matrix);
            }
        }


        public Iterator<ImageMatrix> iterator() {
            return this.list.iterator();
        }
        public static void main(String[] args){
            ImageMatrixDB i = new ImageMatrixDB();
            try{
                i.load("cw2DataSet1.csv"); 
                i.printResults();
            }
            catch(Exception ex){
                ex.printStackTrace();
            }
        }

    }
import java.util.*;
导入java.io.*;
公共类ImageMatrixDB实现了Iterable{
私有列表=新的ArrayList();
公共ImageMatrixDB加载(字符串f)引发IOException{
试一试(
FileReader fr=新的FileReader(f);
BufferedReader br=新的BufferedReader(fr)){
字符串行=null;
而((line=br.readLine())!=null){
int lastcoma=line.lastIndexOf(',');
int classCode=Integer.parseInt(line.substring(1+lastcoma));
int[]data=Arrays.stream(line.substring(0,lastcoma).split(“,”))
.mapToInt(整数::parseInt)
.toArray();
ImageMatrix矩阵=新的ImageMatrix(数据,类别代码);
列表。添加(矩阵);
}
}
归还这个;
}
公开作废打印结果(){
用于(ImageMatrix矩阵:列表){
系统输出打印LN(矩阵);
}
}
公共迭代器迭代器(){
返回此.list.iterator();
}
公共静态void main(字符串[]args){
ImageMatrixDB i=新的ImageMatrixDB();
试一试{
i、 加载(“cw2DataSet1.csv”);
i、 打印结果();
}
捕获(例外情况除外){
例如printStackTrace();
}
}
}

您的加载方法可以抛出一个
IOException
。您需要捕获它才能成功编译

public static void main(String[] args){
    ImageMatrixDB i = new ImageMatrixDB();
    try{
        i.load("dataset1.csv"); // <<< ERROR IS HERE
    }
    catch(Exception e){
        System.out.println(e.getMessage());
    }
}
publicstaticvoidmain(字符串[]args){
ImageMatrixDB i=新的ImageMatrixDB();
试一试{

i、 load(“dataset1.csv”);//为什么在main中创建ImageMatrixDB,然后在ImageMatrixDB.load()中创建方法创建ImageMatrixDB的另一个实例?您有什么建议,我明白您的意思。在您在main中创建的实例中,您可以在该实例上调用load。在load方法中,只需将列表设置为this
,而不是result,并根据需要返回this
(这将是当前实例)。您还可以提供ImageMatrix类吗?不管怎样,我看到了ImageMatrix类。另一方面,您不应该将字段像ImageMatrix中的数据一样公开。将它们设置为私有并提供公共的getter/setter方法。错误消息是什么?添加了您的建议,在线程“main”中仍然收到异常java.lang.Error:未解决的编译问题:未处理的异常类型IOException检查答案,我已经更新了您的代码,包括处理异常。因为您在load()方法中抛出IOException,所以必须在main中捕获它,在那里调用ImageMatrixDB.load().啊,我知道问题出在哪里了,谢谢你把它弄清楚真的很有帮助。现在开始尝试实现kNN算法:)再次感谢。我看到的一个问题是,输出到终端的数据集是同一个重复的:/是的,我也发现了,ImageMatrix.data属性是
static
。好了,这就是为什么o除非绝对必要,否则避免使用静态变量。我已更新了答案以更正此问题。