【问题标题】:Sorting collections using a Map with string and separate class使用带有字符串和单独类的 Map 对集合进行排序
【发布时间】:2012-03-17 20:17:48
【问题描述】:

我基本上是在尝试将 Student 和 Marks 的输入文件按字母和数字顺序排序。我有 4 节课,但是我无法让它以任何顺序打印带有标记的学生。更不用说按字母和数字顺序了。非常感谢任何关于如何获得打印结果的帮助或任何帮助。 下面是我用于 4 个类和输入文件的代码。

输入文件:

Simon 4
Anna 10
Simon 4
Anna 9
Anna 5
Edward 10

代码:

package part1;
import java.io.FileReader;
import java.util.*;
public class Main {
    public static void main(String[] args) throws Exception {
        Map<String, StudentMath> map = new HashMap<String, StudentMath>();
        String input = "data/results.txt";
        Scanner scan = new Scanner(new FileReader(input));
        while (scan.hasNextLine()) {
            String line = scan.nextLine();
            String[] in = line.split(" ");
            String name = in[0];
            int mark = Integer.parseInt(in[1]);
            //System.out.println(name + ":" + mark);
            StudentMath stud = map.get(name);
            if (stud == null) {
                stud = new StudentMath(name, mark);
                map.put(name, stud);
                stud.sum(mark);
            }

        }
        for (String s: map.keySet()){
            System.out.println(s);
        }
    }
}

package part1;

public class StudentMath extends Main {

    public String name;
    public int mark;

    public StudentMath(String s, int n) {
        name = s;
        mark = n;
    }

    public String getName() {
        return name;

    }
    public int getMark() {
        return mark;
    }

    public int sum() {
       int tot = mark + mark;
       return tot;
    }

    public boolean equals(Object o) {
        if (o instanceof StudentMath) {
            StudentMath m = (StudentMath) o;
            return (name == m.name) && (mark == m.mark);

        }
        else {
            return false;
        }
    }
}

package part1;

import java.util.Comparator;

public class NameCompare implements Comparator<StudentMath> {
    public int compare(StudentMath g1, StudentMath g2) {
        return g1.name.compareTo(g2.name);
    }
}


package part1;


import java.util.Comparator;

public class MarkCompare implements Comparator<StudentMath>{

    public int compare(StudentMath g1, StudentMath g2) {
        return g2.mark - g1.mark;
    }
}

【问题讨论】:

  • 不清楚你到底遇到了什么问题

标签: java sorting map


【解决方案1】:

HashMap 是一个 无序 集合,因此它没有定义对其键的排序。这就是您以随机顺序获得输出的原因。

您可以尝试使用有序集合类型,例如ListArrayListLinkedList),或者如果您确实需要Map,则可以查看TreeMap 类。 TreeMap 是一个 Map 实现,它知道如何对其键进行排序。请注意,TreeMap 无法按值排序,因此它可能不是在这里使用的正确数据结构,因为您将无法(轻松)使用它按标记排序。

我不会给你代码,因为这显然是家庭作业,但希望这会让你走上正轨。

编辑:解决以下评论:orderedsorted 不同。要将List 实际排序为您想要的顺序,请查看Collections.sort 方法。

【讨论】:

  • A list 不是有序集合。除非您指的是广告订单
  • @user384706:嗯……是的。从列表中获得的Iterator 的行为是明确定义的:列表始终以某种已知的顺序排列,并且(除非底层数据发生更改)迭代器将始终以相同的顺序返回项目。 HashMap 不提供此保证,因此它是“无序的”。 sorted 集合始终是 ordered 集合,但有序集合不一定是有序集合。
  • 问题是,我需要将分数发送到StudentMath类,计算总数,然后返回给Main类。但是,我无法让它有效地工作。
  • 通过查找学生的姓名并在未找到时创建一个新的StudentMath 对象,您的想法是正确的。现在想想当您查看地图时会发生什么,它 返回 null。你的代码是做什么的?它应该做什么?
  • @CameronSkinner:the list is always in some known order and the iterator returns items in the same order。是的,但这是插入顺序而不是自然顺序。从您的评论和回答来看,我仍然不清楚您在说什么顺序
【解决方案2】:

永远不要使用“==”比较字符串,始终使用“等于”进行比较。 在行中

return (name == m.name) && (mark == m.mark);

改成

return (name.equals(m.name))&& (mark == m.mark);

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2018-03-18
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多