0

我想很多人都遇到过这个问题,你有一个由字符串分量和整数组成的二维数组。前任。

    `String[][] data = {{"Name1","5"}, {"Name2","10"},{"Name3","1"}, {"Name4","3"}};`

现在您想按整数(在本例中为球员得分)对该二维数组进行排序,但是您希望匹配的名称与球员得分一起移动。这就是我所拥有的,但结果与预期的相差甚远。

    private void sort(){
    boolean sort;
    int current, next;
    do{
            sort = true;
            for (int i = 0; i < data.length - 1; i++){
                if (data[i][1] !=null && data[i+1][1] != null){
                    current = Integer.parseInt(data[i][1]);
                    next = Integer.parseInt(data[i+1][1]);
                        if(current > next){
                                String temp = "";
                                data[i][1] = Integer.toString(next); 
                                data[i+1][1] = Integer.toString(current);
                                data[i][0] = temp;
                                data[i][0] = data[i+1][1];
                                data[i+1][0] = temp;       
                                sort = false;
                        }
                }

            }

    }while(!sort);
}

如果你问为什么人们会使用一个普通的二维数组,那是因为在 JFRAME 中,一个 JTable 需要一个二维数组来存储数据。

4

2 回答 2

4

您可以编写一个特殊的比较器,它可以比较例如 {"Name1","5"}{"Name2","10"} 但我建议更改您的数据结构。

我会创建一个类型 caonatining nameint

class NameNum{
   String name;
   int number;
}

并将它们存储在一维数组中

NameNum[] data 

实现一个比较方法,而不是简单地用于Arrays.sort(..)对数组进行排序。

于 2013-01-03T01:10:57.167 回答
0

首先:您的数组元素包含字符串和整数,因为在:

{ "Name1", "5" }

"5"不是一个,Integer而是一个String

如果您不关心相等性,这里的解决方案是在此元组上创建一个包装器对象,使其Comparable自行实现并使用SortedSet. 您必须将其反转才能显示,幸运的是 JDK 也为此提供了内置方法。

示例代码:

private static final String[][] data = {
    { "Name1", "5" },
    { "Name2", "10" },
    { "Name3", "1" },
    { "Name4", "3" }
};

private static final class Score
    implements Comparable<Score>
{
    private final String name;
    private final int score;

    private Score(final String name, final String scoreAsString)
    {
        this.name = name;
        // NOTE: this can throw an (unchecked) NumberFormatException,
        // but this code assumes that it never does
        score = Integer.parseInt(scoreAsString);
    }

    @Override
    public int compareTo(final Score o)
    {
        final int ret = score - o.score;
        return ret != 0 ? ret : name.compareTo(o.name);
    }

    // Print results nicely ;)
    @Override
    public String toString()
    {
        return "Name: " + name + ", score: " + score;
    }
}

public static void main(final String... args)
{
    final SortedSet<Score> set = new TreeSet<Score>();
    Score score;

    for (final String[] raw: data) {
        score = new Score(raw[0], raw[1]);
        set.add(score);
    }

    // Build a List from that Set...
    final List<Score> scoreList = new ArrayList<Score>(set);

    // Reverse it...
    Collections.reverse(scoreList);

    // Print results
    for (final Score s: scoreList)
        System.out.println(s);
}

将上面的代码复制/粘贴到一个类中,运行它:你会看到它完成了预期的工作。

重要提示:是的,这个自定义类不会覆盖equals()/ hashCode();这不是疏忽:因为这里只需要比较(因为SortedSet使用了 a),所以根本没有理由实施它们。

于 2013-01-03T01:55:49.297 回答