使用数字字段对2D数组字符串进行排序

时间:2013-01-03 01:08:11

标签: java string sorting multidimensional-array integer

我想很多人都遇到过这个问题, 你有一个由String conponent和Interger组成的2D数组。 离。

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

现在您想要按整数(在这种情况下是玩家得分)对2D数组进行排序,但是您希望匹配的名称与玩家得分一起移动。 这就是我所拥有的,但结果远远超出了它的预期。

    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);
}

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

2 个答案:

答案 0 :(得分:4)

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

我会创建一个类型caonatining 名称 int

class NameNum{
   String name;
   int number;
}

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

NameNum[] data 

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

答案 1 :(得分: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),所以没有理由实施它们。