歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java對象排序

Java對象排序

日期:2017/3/1 10:38:47   编辑:Linux編程
  1. import java.util.Arrays;
  2. import java.util.Comparator;
  3. public class TestSort {
  4. public static void main(String[] args) {
  5. TestSort ts = new TestSort();
  6. Integer[] it = new Integer[10];
  7. for (int i = 0; i < 10; i++) {
  8. it[i] = new Integer(10 - i);
  9. }
  10. ts.mergeSort(it, 0, it.length - 1, null);
  11. System.out.println(Arrays.toString(it));
  12. // 輸出結果為:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  13. // 上面是對Integer對象進行排序
  14. /*************************************************************/
  15. // 下面是對Person對象進行排序
  16. PersonCompator pc = new PersonCompator();
  17. Person[] per = new Person[] { new Person(23, "a"), new Person(12, "b"),
  18. new Person(1, "c"), new Person(44, "d") };
  19. ts.mergeSort(per, 0, per.length - 1, pc);
  20. System.out.println(Arrays.toString(per));
  21. // 輸出結果為:[c:1, b:12, a:23, d:44]
  22. }
  23. /*
  24. * 對於對象比較有兩種方法,第一種是重寫此類,實現Compareable接口,Integer類就是這麼做的,
  25. * 所以此時可以直接將所有對象自動向上轉型為Object,再對其進行比較,進而排序
  26. *
  27. * 第二種則是寫一個此類的比較類,實現Comparator,下面的Person類就是這麼干的,此時只需調用 比較類的compare方法即可
  28. */
  29. private <T> void mergeSort(T[] arr, int i, int j, Comparator<? super T> c) {
  30. if (i < j) {
  31. int k = (i + j) / 2;
  32. mergeSort(arr, i, k, c);
  33. mergeSort(arr, k + 1, j, c);
  34. merge(arr, i, k, j, c);
  35. }
  36. }
  37. private <T> void merge(T[] arr, int p, int r, int q, Comparator<? super T> c) {
  38. int n1 = r - p + 1;
  39. int n2 = q - r;
  40. T[] L = arr.clone();
  41. System.arraycopy(arr, p, L, 0, n1);
  42. T[] R = arr.clone();
  43. System.arraycopy(arr, r + 1, R, 0, n2);
  44. int i = 0, j = 0, k = p;
  45. if (c == null) {
  46. while (i < n1 && j < n2) {
  47. if (((Comparable<T>) L[i]).compareTo(R[j]) <= 0) {
  48. arr[k++] = L[i++];
  49. } else {
  50. arr[k++] = R[j++];
  51. }
  52. }
  53. } else {
  54. while (i < n1 && j < n2) {
  55. if (c.compare(L[i], R[j]) <= 0) {
  56. arr[k++] = L[i++];
  57. } else {
  58. arr[k++] = R[j++];
  59. }
  60. }
  61. }
  62. while (i < n1) {
  63. arr[k++] = L[i++];
  64. }
  65. while (j < n2) {
  66. arr[k++] = R[j++];
  67. }
  68. }
  69. }
  70. class Person {
  71. private int age;
  72. private String name;
  73. public Person() {
  74. }
  75. public Person(int a, String n) {
  76. this.setAge(a);
  77. this.setName(n);
  78. }
  79. public int getAge() {
  80. return age;
  81. }
  82. public void setAge(int age) {
  83. this.age = age;
  84. }
  85. public String getName() {
  86. return name;
  87. }
  88. public void setName(String name) {
  89. this.name = name;
  90. }
  91. public String toString() {
  92. return this.getName() + ":" + this.getAge();
  93. }
  94. }
  95. class PersonCompator implements Comparator<Person> {
  96. public int compare(Person o1, Person o2) {
  97. return o1.getAge() - o2.getAge();
  98. }
  99. }
Copyright © Linux教程網 All Rights Reserved