当前位置: 首页 > 知识库问答 >
问题:

为任何可比性集合编写排序方法(Java)

阚亮
2023-03-14

我如何才能编写一个排序方法,它将与实现comparable的任何类的collection一起工作?我查看了collections.sort()的源代码,它的方法签名中有一些语法我不理解。

public static <T extends Comparable<? super T>> void sort(List<T> list) {
    Object[] a = list.toArray();
    Arrays.sort(a);
    ListIterator<T> i = list.listIterator();
    for (int j=0; j<a.length; j++) {
        i.next();
        i.set((T)a[j]);
    }
}

下面是我对如何编写sortnone方法的最佳(可悲的)猜测,该方法不对collection进行排序,但有正确的方法头来进行排序。我将使用sortnone.sort(myCollection)调用它,其中myCollection是实现comparable的类的collection的任何类的实例(假设之前导入了com.tenembasj.sort.*,请参阅更多信息)。

package com.tenembasj.sort;

public class SortNone {

    public static<T> void sort(Collection<E> collection) { //don't know how to require the object (is it T or E?) to implement Comparable
        //code to sort
        //would I have to use collection.size(), .get(i), .set(i), and such to edit the class implementing Collection?
    }
}

此外,我想添加一个sort方法,它为比较器添加一个参数,我只需要知道形参是什么。我想,一旦我知道如何编写常规的sort时,我就能搞清楚实现了。

同样,我正在尝试编写自己的排序方法,而不使用collections.sort()arrays.sort()或任何java.util方法。你可能会说“不要推倒重来”,但我只是在努力学习。

更多信息

我想在完成后将这些方法导出到一个jar中,并在以后的项目中将它们作为一个库导入。我制作了一个新项目(在Eclipse中),创建了一个名为com.tenembasj.sort的包,并将添加诸如mergeSort之类的类。我相信这是标准的命名惯例,但如果不是,请告诉我。我的目标是能够在未来的任何项目中键入import com.tenembasj.sort.*,并调用mergesort.sort(myCollection);mergesort.sort(myCollection,myComparator);

共有1个答案

廉雅惠
2023-03-14

我如何才能编写一个排序方法,它将与实现Collection的任何类一起工作,并与实现Comparable的任何类一起工作呢?

为了编写一个可以应用于所有类型对象的函数,您必须编写一个泛型代码,就像上面从Collections.sort()源发布的代码一样。

假设你是一个初学者,最好的开始就是向generic学习,一口一口地吃掉大象。

扩展可比<?超级T>表示T必须是可比较的对象。它可以是扩展可比接口的object类型,也可以是包含可比接口的任何对象。

sort(list list) 表示排序函数可以接受t类型对象的任何list作为参数。

public static <T extends Comparable<? super T>> void sort(List<T> list) {

//  Copying the values from the List of objects to an array.
    Object[] a = list.toArray();

//  Applying the array.sort operation.
    Arrays.sort(a);

//  Setting the values from the sorted array to the listi of type T. 
    ListIterator<T> i = list.listIterator();
    for (int j=0; j<a.length; j++) {
        i.next();
        i.set((T)a[j]);
    }
}

从学习泛型开始

 类似资料:
  • 我对在Java中实现一个特殊的优先级队列变体很感兴趣,我希望这个优先级队列能够与泛型类型一起工作。在Java的集合对象中,存储具有某种排序的对象(例如PriorityQueue、TreeSet等),可以使用实现Compariable的类以及不一定实现Compariable的类,因为类的比较器传递给构造函数。 如何在优先级队列类中实现此功能?如果给我一个比较器,我是否必须根据类是否实现Compara

  • 我正在研究一个扑克牌洗牌的问题,并找到了两个解决方案。 目标是将存储在阵列中的所有52张扑克牌作为卡对象进行洗牌。卡类具有与其关联的id和名称。 现在,一种方法是使用for循环迭代,然后在临时卡对象持有者和随机数生成器的帮助下,我们可以交换两个对象。这一直持续到我们到达一半的卡片。 另一种方法是使用随机生成器编号实现可比较的覆盖比较方法,因此每次调用该方法时都会得到随机响应。 你觉得哪条路更好?

  • 我知道它已经被询问和回答了数百万次,但我仍然无法弄清楚为什么我在排序期间收到了违规。这是我的代码: 我收到了这个错误 有什么想法吗?

  • 问题内容: 我有2个月的2个数据集,包括学生的姓名和分数。 我需要提供每个学生的2月分数,以及他/她2月分数的变化百分比。 我可以使用Java集合吗? 样本数据集: 输出应该是这样的 (名称:约翰,2月分数:80,百分比变化:100) (名称:玛丽,2月的分数:81,百分比变化:32.76) (名称:吉姆,2月的分数:82,百分比变化:57.69) (名称:利兹,2月的分数:84 ,百分比变化:N

  • 可能重复:< br >使用多个键对Java对象排序 我找不到任何使用此方法的示例,所有示例都给出了第二个参数“null”。我听说这个方法用于根据一个以上的标准对类进行排序,但没有找到任何示例。 } 如果我想根据学生的名字对学生列表进行排序

  • 本文向大家介绍为Python中的数值数据集编写排序算法?,包括了为Python中的数值数据集编写排序算法?的使用技巧和注意事项,需要的朋友参考一下 排序是指以特定格式排列数据。它使数据更具可读性,并且可以将数据搜索优化到很高的水平。有五种不同的排序算法。 气泡排序 合并排序 插入排序 贝壳类 选择排序 示例 这是一种基于比较的算法,其中比较每对相邻元素,如果元素顺序不正确,则将其交换。 输出结果