我想很多人都遇到过这个问题, 你有一个由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数组来存储数据。
答案 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
),所以没有理由实施它们。