我创建了一个自己的SortedSet,这是向数组添加内容的代码。(我知道有比数组更好、更简单的方法可以做到这一点,但必须这样做)
public boolean add(AnyType x){
if(this.contains(x))
return false;
else if(this.isEmpty()){
items[theSize]=x;
theSize++;
return true;
}
else{
if( theSize == items.length )
this.grow();
//Here goes code for adding
theSize++;
AnyType[] newItems = (AnyType[]) new Comparable[theSize];
for(int i=0;i<theSize-1;i++)
if(items[i].compareTo(x)>0){
newItems[i]=x;
newItems[i+1]=items[i];
for(int j=i+2;j<theSize;j++)
newItems[j]=items[j-1];
items = newItems;
return true;
}
else
newItems[i]=items[i];
newItems[theSize-1] =x;
items=newItems;
return true; //*/
}
}
我正在测试这样的排序数字字符串:
public static void main(String[] a) {
SortedSet<String> s1 = new SortedSet<String>();
final int NUM1 = 37;
final int NUM2 = 53;
final int NUM3 = 61;
for (int i = NUM1; i != 0; i = (i + NUM1) % NUM3) {
s1.add("" + i);
}
s1.show();
for (int i = NUM1; i != 0; i = (i + NUM1) % NUM3) {
s1.add("" + i);
}
s1.show();
for (int i = NUM1; i != 0; i = (i + NUM1) % NUM2) {
s1.remove("" + i);
}
s1.show();
}
在我得到的输出中:
1 10 11 12 13 14 15 16 17 19 2 20 21 23 24 25 26 27 29 3 30 31 33 34 35 36 37 39 4 40 41 43 45 47 48 5 50 51 52 53 54 55 56 58 59 6 60 7 8 9
我的问题是,我该如何将其按应有的方式排序??我知道问题出在加法方法上(它应该能够对字符串和整数进行排序)
当我创建一个字符串或整数的SortedSet时,它运行得非常好,当我像这样混合它们时,我会得到"未排序"的结果。
帮助??谢谢
在我看来,这些字符串就像排序后的字符串。"1"在"10"之前,就像字典中"a"在"ab"之前一样@MRAB有一个正确的建议,如果你想按数字顺序排序,可以将表示数字的字符串转换为实际数字。
如果你想让你的集合保持为SortedSet<String>
(下面的代码段中没有执行错误检查),你可以用比较器来做这件事:
SortedSet<String> s1 = new TreeSet<String>(new Comparator<String>() {
/**
* Returns a positive value if number1 is larger than number 2, a
* negative number if number1 is less than number2, and 0 if they
* are equal.
*/
public int compare(String number1, String number2) {
return Integer.parseInt(number1) - Integer.parseInt(number2);
}
});
在比较之前将数字字符串转换为数字。
或者,当比较两个不同长度的数字串时,通过在开头加零,将较短的数字串填充为与较长的数字串相同的长度。