刷题时,遇到的问题,目前是想到了两种方式:一种是重写比较器;另一种是使用字符串的表达方式,然后进行自然排序。
下面给出例子。
1、改写比较器方式
package schooloffer17;
import java.util.*;
/**
* @Author: cxh
* @CreateTime: 17/11/21 15:28
* @ProjectName: JavaBaseTest
* <字典排序></>
*/
public class DictionaryOrder {
public static void main(String[] args) {
int n,m;
Scanner scanner=new Scanner(System.in);
while (scanner.hasNextInt()){
n=scanner.nextInt();//n个数字排序
ArrayList<Integer> list=new ArrayList<Integer>();
for(int i=0;i<n;i++)
list.add(i+1);
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
String str1=String.valueOf(o1);
String str2=String.valueOf(o2);
if(str1.length()==str2.length()){
return (int)(o1-o2);//长度相同,升序
}else{
for(int i=0;i<Math.min(str1.length(),str2.length());i++){
if(str1.charAt(i)!=str2.charAt(i)){
return str1.charAt(i)-str2.charAt(i);
}
}
return str1.length()-str2.length();
}
}
});
//输出list
Iterator<Integer> iterator=list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next()+",");
}
}
}
}
输入:15输出结果:
1,
10,
11,
12,
13,
14,
15,
2,
3,
4,
5,
6,
7,
8,
9,
2、自然排序方式
package schooloffer17;
import java.util.*;
/**
* @Author: cxh
* @CreateTime: 17/11/21 15:28
* @ProjectName: JavaBaseTest
* <字典排序></>
*/
public class DictionaryOrder {
public static void main(String[] args) {
int n,m;
Scanner scanner=new Scanner(System.in);
while (scanner.hasNextInt()){
n=scanner.nextInt();//n个数字排序
ArrayList<String> list=new ArrayList<String>();
for(int i=0;i<n;i++)
list.add(String.valueOf(i+1));
Collections.sort(list);
//输出list
Iterator<String> iterator=list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next()+",");
}
}
}
}
输入:15
输出结果:
1,
10,
11,
12,
13,
14,
15,
2,
3,
4,
5,
6,
7,
8,
9,
3、其实改写比较器是常写的,自己比较熟悉,这次是对String类型的集合进行自然排序的第一次使用,原来String类型的集合自然排序是字典排序形式,这可能以后在刷题时候可以用到的一个方式呢。同时测试了数组类型为String,自然排序也是字典排序。只是写法两个不同而已,数组就是Arrays.sort(),而list集合是Collections.sort()。