当前位置: 首页 > 知识库问答 >
问题:

JAVAClassCastException:类java。util。树映射不能转换为java类。可比的

禄光霁
2023-03-14

当试图运行我的java程序时,我收到以下错误

Exception in thread "main" java.lang.ClassCastException: class java.util.TreeMap cannot be cast to class java.lang.Comparable (java.util.TreeMap and java.lang.Comparable are in module java.base of loader 'bootstrap')
    at java.base/java.util.TreeMap.compare(TreeMap.java:1569)
    at java.base/java.util.TreeMap.addEntryToEmptyMap(TreeMap.java:776)
    at java.base/java.util.TreeMap.put(TreeMap.java:785)
    at java.base/java.util.TreeMap.put(TreeMap.java:534)
    at exportsParser.exportsMap(exportsParser.java:53)
    at exportsParser.main(exportsParser.java:28)

适用代码:

import edu.duke.*;
import java.io.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.*;
import java.util.*;
import java.util.TreeMap;
import java.util.Iterator;

public class exportsParser{

    void println(Object obj){
        System.out.println(obj);
    }

    /* The rather involved pattern used to match CSV's consists of three
     * alternations: the first matches aquoted field, the second unquoted,
     * the third a null field.
     */
    private final static Pattern csv_pattern = Pattern.compile("\"([^\"]+?)\",?|([^,]+),?|,");

    public static void main(String[] argv) throws IOException {
        //println(csv_pattern);
        exportsParser parser = new exportsParser();
        BufferedReader reader = new BufferedReader(new FileReader("./exports_small.csv"));
        parser.exportsMap(reader);
    }
    public TreeMap<String, TreeMap<TreeMap<String,String> ,TreeMap<String, String>>> exportsMap(BufferedReader reader) throws IOException{

        if(reader.readLine() == null) return null;

        TreeMap<String, TreeMap<TreeMap<String,String>, TreeMap<String,String>>> exportsTable = new TreeMap<>();
        TreeMap<String, String> products = new TreeMap<>();
        TreeMap<String, String> value = new TreeMap<>();
        TreeMap<TreeMap<String,String>,TreeMap<String,String>> exportsData = new TreeMap<>();

        int countryIndex = 0;

        ArrayList<String> exportsList = new ArrayList<String>();
        String line;

        try{
            while((line = reader.readLine()) != null){
                exportsList = parse(line);

                String countryName = exportsList.get(0);
                products.put("items", exportsList.get(1));
                value.put("total", exportsList.get(2));
                println(products);
                println(value);
                exportsData.put(products, value);
                println(exportsData);

    //              exportsTable.put(countryName,exportsData);
                println(exportsTable);
            }
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        reader.close();
        return exportsTable;
    }

    /* Parse one line.
     * @return List of Strings, minus their double quotes
     */
    public ArrayList<String> parse(String line) {
        ArrayList<String> list = new ArrayList<String>();
        Matcher mat = csv_pattern.matcher(line);
        // For each field
        while (mat.find()) {
            String match = mat.group();
            if (match == null)
                break;
            if (match.endsWith(",")) {  // trim trailing ,
                match = match.substring(0, match.length() - 1);
            }
            /*if (match.startsWith("\"")) { // assume also ends with
              match = match.substring(1, match.length() - 1);
              }*/
            if (match.length() == 0)
                match = null;
            list.add(match);
        }
        return list;
    }
}

澄清一下,当试图将产品和价值的TreeMap数据放入exportsData时,会出现问题。当试图将exportsData添加到将其键(国家)与exportsData(价值)相关联的exportsTable时,同样适用。我明白错误的含义,只是不知道如何修复它。此外,不允许库(目的是了解输入数据流向“行/列”,并尝试使用Trees、HashMaps等)

此外,我不能使用数据库来进行此操作,因为这是手动执行此操作的要求。然而,不需要的是使用树形图。我们可以尝试各种收集课程。

我花了一段时间试图让这个工作,但我已经用完的想法和论坛页面阅读了。最终,这将是理想的,使其能够满足未知列的更大CSV文件。然而,对于实践运行,我们已经得到了手头的信息,因此在上面的代码中建立了索引。

CSV数据:

Country,Exports,Value (dollars)
Germany,"motor vehicles, machinery, chemicals","$1,547,000,000,000"
Macedonia,"tobacco, textiles","$3,421,000,000"
Madagascar,"coffee, vanilla, shellfish","$864,800,000"
Malawi,"tea, sugar, cotton, coffee","$1,332,000,000"
Malaysia,"semiconductors, wood","$231,300,000,000"
Namibia,"diamonds, copper, gold, zinc, lead","$4,597,000,000"
Peru,"copper, gold, lead, zinc, tin,  coffee","$36,430,000,000"
Rwanda,"coffee, tea, hides, tin ore","$720,000,000"
South Africa,"gold, diamonds, platinum","$97,900,000,000"
United States,"corn, computers, automobiles, medicines","$1,610,000,000,000"

这是我第一次使用上述方法,所以初学者很容易出错。

共有1个答案

楚硕
2023-03-14

查看javadoc。举个例子-映射是根据其键的自然顺序进行排序的,或者由映射创建时提供的比较器进行排序的,具体取决于使用的构造函数 键的自然顺序意味着键必须实现可比性。您的密钥属于TreeMap类型,它没有自然排序-它不实现可比。这自然会导致ClassCastException

如果您真的必须使用TreeMap作为TreeMap的键,则必须提供TreeMap构造函数的比较器:

Comparator<TreeMap<String,String>> comparator = implement it;
TreeMap<TreeMap<String,String>,TreeMap<String,String>> exportsData = new TreeMap<>(comparator);

鉴于您的数据来自csv文件,我建议将其解析为一些自定义类。它的可读性要高得多,而且如果需要,可以更容易地实现Comparable,或者Comparator

 类似资料:
  • 我们正在从Spring 5.0迁移到Spring Boot 2.4版本。我的控制器代码如下 响应主体是一个HashMap,如上图所示。这段代码在普通的spring webapp中运行良好。同样的代码当我们厌倦了SpringBoot时,我们会得到以下错误 这个错误是在执行代码时从Spring-webmvc.jar的AbstractMessageConvertermetodProcessor.clas

  • 我是新手。问题1——在将count=5的“Sam”添加到TreeMap之前,如何获得值为1的“Sam”计数?ie目前“sam”的计数为5。我希望计数是6。 问题2——关于人。Containsky,我怎样才能得到那个记录的“containsValue”或“count”? 蒂亚

  • 我在解决泛型问题时遇到了一些麻烦。我有一个“猫”对象列表和一个“狗”对象列表,我需要将它们传递到同一个方法中。该方法的返回类型是一个“字符串”和“动物列表”的映射,我试图找出一种方法来将带有动物列表的映射转换为带有猫或狗列表的映射。 这工作很好,如果我有一个单独的方法猫和狗,但我正在寻找一个更灵活的解决方案。 标题中出现错误的行: 注意:这是一个简化的例子,我必须能够使用地图中的列表作为“猫”或“

  • 我需要在代码的几个地方将这个映射转换为我的case类,如下所示: 最简单的方法是什么?我能用隐式吗?

  • 我有两个微服务是通过外国沟通。一个微服务公开另一个正在调用的方法。该方法将日期作为参数。 这是方法的代码: == 另一个微服务使用这个外来类来调用这个方法: == 我的代码正在启动此异常: 未能转换“java”类型的值。lang.String“to required type”java。util。日期';嵌套异常为org。springframework。果心转换ConversionFailedEx