对基本数据类型和字符串进行排序
基本数据类型集合排序
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
List<Integer>prices = new ArrayList<Integer>();
for (int i = 0; i < 5; i++) {
System.out.println("请输入第" + (i + 1) + "个商品的价格");
int p = input.nextInt();
prices.add(Integer.valueOf(p));//将录入的价格保存到List中
}
Collections.sort(prices);//调用sort()方法对集合进行排序
System.out.println("价格从低到高的排列为:");
for (int i = 0; i < prices.size(); i++){
System.out.println(prices.get(i) + "\t");
}
}
字符串集合排序
public static void main(String[] args) {
//定义List,往list里添加数据
List<String> list = new ArrayList<String>();
list.add("orange");
list.add("tomato");
list.add("apple");
list.add("litchi");
list.add("banana");
//迭代器遍历方法输出
Iterator it = list.iterator();
while (it.hasNext()){
System.out.print(it.next() + " ");
}
System.out.println(" ");
System.out.println("***********************");
//排序
Collections.sort(list);
Iterator its = list.iterator();
while (its.hasNext()){
System.out.print(its.next() + " ");
}
}
Comparator 接口(自定义排序)
要注意的是:
- 若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。
- int compare(T o1, T o2) 是“比较o1和o2的大小”,其中o1指的就是第一个要比较的对象, o2指的就是第二要比的对象。 比较之后会根据大小返回值。 返回“负数”, 意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2。
- 不重写 Object.equals(Object) 方法总是安全的。然而,在某些情况下,重写此方法可以允许程序确定两个不同的 Comparator 是否强行实施了相同的排序,从而提高性能。
- Compare :比较用啦排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数,零,或正整数。
- quals : 指示某个其他对象是否“等于”此Comparator。此方法必须遵守Object.equals(Object)的常规协定。此外,仅当指定的对象于是一个Comparator,并且强行实施于此Comparator相同的排序时,此方法才返回true。因此,compl.equals(comp2)意味着对每个对象引用o1和o2而言,都存在sgn(compl.compare(o1,o2)) == sgn(somp2.compare(o1,o2))。
Comparable 接口(自然排序)
Comparable接口内部只有一个要重写的关键的方法,为:
int compareTo(T o);
该方法只返回一个int型的值,例如 i = x.compareTo(y) ,如果i = 0,则表明x和y在排位上是相等的(并非意味着x.equals(y) = true, 但是jdk api上强烈建议这样处理)。
如果返回数值 i>0,则意味 x>y,反之若 i<0,意味x<y。