Сортировка коллекций с использованием Map со строкой и отдельным классом - PullRequest
0 голосов
/ 18 марта 2012

Я в основном пытаюсь отсортировать входной файл учеников и меток в алфавитном и числовом порядке. У меня есть 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;
    }
}

Ответы [ 2 ]

2 голосов
/ 18 марта 2012

A HashMap является коллекцией неупорядоченной , поэтому она не определяет порядок ее ключей.Вот почему вы получаете выходные данные в случайном порядке.

Вы можете попробовать использовать упорядоченный тип коллекции, например List (ArrayList или LinkedList), или если вам действительно нужно иметьMap тогда вы можете посмотреть на TreeMap класс.TreeMap - это реализация Map, которая знает, как сортировать ключи.Обратите внимание, что TreeMap не может сортировать по значению, поэтому, вероятно, здесь не подходит структура данных, поскольку вы не сможете (легко) использовать ее для сортировки по метке.

Я не буду давать вам код, потому что это явно домашнее задание, но, надеюсь, это поможет вам выбрать правильный путь.

РЕДАКТИРОВАТЬ: Чтобы ответить на комментарий ниже: заказано не то же самое отсортирован .Чтобы на самом деле отсортировать List в нужном вам порядке, взгляните на методы Collections.sort.

1 голос
/ 18 марта 2012

Никогда не сравнивайте строки, используя "==", всегда используйте "равно" для сравнения.в строке

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

изменить на

return (name.equals(m.name))&& (mark == m.mark);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...