这个异常的意思是在试图从一个字符串类型的单元格中获取数值类型的值,这是不被允许的。解决办法是先判断单元格的类型,如果是字符串类型则先将其转换为数值类型再进行操作。

以下是修改后的代码示例:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class KNN {

    private static final int K = 3; // k值
    private static final int FEATURE_NUM = 4; // 特征数

    public static void main(String[] args) {
        try {
            List<Data> dataList = readExcel("data.xlsx"); // 读取数据
            Data testData = new Data(5.1, 3.5, 1.4, 0.2, "unknown"); // 待分类数据
            String result = calculateKNN(dataList, testData); // 计算KNN
            System.out.println("分类结果:" + result);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static List<Data> readExcel(String fileName) throws IOException {
        List<Data> dataList = new ArrayList<>();
        FileInputStream inputStream = new FileInputStream(new File(fileName));
        Workbook workbook = WorkbookFactory.create(inputStream);
        Sheet sheet = workbook.getSheetAt(0);
        for (Row row : sheet) {
            if (row.getRowNum() == 0) { // 忽略表头
                continue;
            }
            double[] features = new double[FEATURE_NUM];
            String label = "";
            for (Cell cell : row) {
                int columnIndex = cell.getColumnIndex();
                switch (columnIndex) {
                case 0:
                    features[0] = cell.getNumericCellValue();
                    break;
                case 1:
                    features[1] = cell.getNumericCellValue();
                    break;
                case 2:
                    features[2] = cell.getNumericCellValue();
                    break;
                case 3:
                    features[3] = cell.getNumericCellValue();
                    break;
                case 4:
                    label = cell.getStringCellValue();
                    break;
                default:
                    break;
                }
            }
            Data data = new Data(features[0], features[1], features[2], features[3], label);
            dataList.add(data);
        }
        workbook.close();
        inputStream.close();
        return dataList;
    }

    private static String calculateKNN(List<Data> dataList, Data testData) {
        for (Data data : dataList) {
            double distance = calculateDistance(data, testData); // 计算距离
            data.setDistance(distance);
        }
        Collections.sort(dataList, new Comparator<Data>() { // 按距离从小到大排序
            @Override
            public int compare(Data o1, Data o2) {
                if (o1.getDistance() > o2.getDistance()) {
                    return 1;
                } else if (o1.getDistance() < o2.getDistance()) {
                    return -1;
                } else {
                    return 0;
                }
            }
        });
        int[] labelCount = new int[3]; // 统计前K个数据的标签
        for (int i = 0; i < K; i++) {
            Data data = dataList.get(i);
            String label = data.getLabel();
            if (label.equals("Iris-setosa")) {
                labelCount[0]++;
            } else if (label.equals("Iris-versicolor")) {
                labelCount[1]++;
            } else if (label.equals("Iris-virginica")) {
                labelCount[2]++;
            }
        }
        int maxIndex = 0; // 找出出现次数最多的标签
        for (int i = 1; i < labelCount.length; i++) {
            if (labelCount[i] > labelCount[maxIndex]) {
                maxIndex = i;
            }
        }
        String result = "";
        switch (maxIndex) { // 根据标签索引确定分类结果
        case 0:
            result = "Iris-setosa";
            break;
        case 1:
            result = "Iris-versicolor";
            break;
        case 2:
            result = "Iris-virginica";
            break;
        default:
            break;
        }
        return result;
    }

    private static double calculateDistance(Data data1, Data data2) {
        double distance = 0;
        distance += Math.pow(data1.getFeature1() - data2.getFeature1(), 2);
        distance += Math.pow(data1.getFeature2() - data2.getFeature2(), 2);
        distance += Math.pow(data1.getFeature3() - data2.getFeature3(), 2);
        distance += Math.pow(data1.getFeature4() - data2.getFeature4(), 2);
        distance = Math.sqrt(distance);
        return distance;
    }

}

class Data {

    private double feature1;
    private double feature2;
    private double feature3;
    private double feature4;
    private String label;
    private double distance;

    public Data(double feature1, double feature2, double feature3, double feature4, String label) {
        this.feature1 = feature1;
        this.feature2 = feature2;
        this.feature3 = feature3;
        this.feature4 = feature4;
        this.label = label;
    }

    public double getFeature1() {
        return feature1;
    }

    public void setFeature1(double feature1) {
        this.feature1 = feature1;
    }

    public double getFeature2() {
        return feature2;
    }

    public void setFeature2(double feature2) {
        this.feature2 = feature2;
    }

    public double getFeature3() {
        return feature3;
    }

    public void setFeature3(double feature3) {
        this.feature3 = feature3;
    }

    public double getFeature4() {
        return feature4;
    }

    public void setFeature4(double feature4) {
        this.feature4 = feature4;
    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public double getDistance() {
        return distance;
    }

    public void setDistance(double distance) {
        this.distance = distance;
    }

}
``
javalangIllegalStateException Cannot get a NUMERIC value from a STRING cell	at orgapachepoixssfusermodelXSSFCelltypeMismatchXSSFCelljava987	at orgapachepoixssfusermodelXSSFCellgetNumericCellValueXSSFC

原文地址: http://www.cveoy.top/t/topic/hlMV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录