从文件创建和排序2d数组

时间:2014-02-18 01:14:14

标签: java arrays file sorting multidimensional-array

好的,基本上我必须用这段代码完成两件事。 1.将文件中的两列排序为数组,然后根据第二列按从大到小的顺序排列。

在开始排序算法之前,我需要让数组正确排序。任何帮助都会很棒。谢谢。 我已经列出了下面文件内容的超链接。

import java.util.*;
import java.io.*;
import java.text.*;
public class sorter{
    public static int id = 0;
    public static int score = 0;
    public static void main(String args[]){
        Scanner inFile = null;
        int ROWS = 21;
        int COLS = 2;
        try {
            inFile = new Scanner (new File ("sorter.txt"));
        } catch (FileNotFoundException e) {
            System.out.println("File not found!");
            System.exit(0); 
        } 
        while (inFile.hasNextLine()){
            String str = inFile.nextLine();
            String [] parts = str.split(" ");
            String part1 = parts[0];
            String part2 = parts[1];
            id = Integer.parseInt(part1);
            score = Integer.parseInt(part2);
            int[ ][ ] array1 = new int[id][score];
            for (int i =0; i < ROWS; i++) { 
                for (int j = 0; j < COLS; j++) { 
                    System.out.print(" " + array1[21][2]); 
                } 
                System.out.println(""); 
            } 
        }
    }
}

Link to file contents

2 个答案:

答案 0 :(得分:0)

您需要创建一个Map(最好是Treemap),其中键是第1列(学生ID),值是第2列(测试分数)。然后您可以按值对其进行排序。按值排序需要小心,因为如果两个学生具有相同的测试分数,那么通常的方法就不会起作用。一种方法如下:

<K,V extends Comparable<? super V>> SortedSet<Map.Entry<K,V>> entriesSortedByValues(Map<K,V> map, final int order) {
    SortedSet<Map.Entry<K,V>> sortedEntries = new TreeSet<>(
        new Comparator<Map.Entry<K,V>>() {
            public int compare(Map.Entry<K,V> e1, Map.Entry<K,V> e2) {
                return (order > 0) ? compareToRetainDuplicates(e1.getValue(), e2.getValue()) : compareToRetainDuplicates(e2.getValue(), e1.getValue());
            }
        }
    );
    sortedEntries.addAll(map.entrySet());
    return sortedEntries;
}

,其中

private static <V extends Comparable<? super V>> int compareToRetainDuplicates(V v1, V v2) {
    return (v1.compareTo(v2) == -1) ? -1 : 1;
}

答案 1 :(得分:0)

我建议您创建一个类来保存每对数据并实现Comparable接口以定义顺序标准,然后您可以使用Arrays.sort()方法。这是一个可能的解决方案:

public void solve()
{
    try {
        Scanner inFile = new Scanner(new File("input.dat"));
        int ROWS = 21;
        int COLS = 2;
        Score[] scores = new Score[ROWS];
        int i = 0;
        while (inFile.hasNextLine()) {
            String line = inFile.nextLine();
            System.out.println(line);
            String[] tokens = line.split(" ");
            int id = Integer.parseInt(tokens[0]);
            int score = Integer.parseInt(tokens[1]);
            scores[i] = new Score(id, score);
            i++;
        }

        Arrays.sort(scores);
        for (i = 0; i < scores.length; i++)
            System.out.println(scores[i].getId() + "-> " + scores[i].getScore());
    } catch (IOException ioe) {

    }
}

class Score implements Comparable<Score> {
    private int id;
    private int score;

    Score(int i, int s)
    {
        id = i;
        score = s;
    }

    public int getId() { return id; }
    public int getScore() { return score; }


    @Override
    public int compareTo(Score other)
    {
        if (getScore() > other.getScore())
            return -1;
        else if (getScore() < other.getScore())
            return 1;
        else
            return 0;
    }

}