【问题标题】:ArrayList - Creating comparatorsArrayList - 创建比较器
【发布时间】:2016-08-08 03:27:28
【问题描述】:

我创建了一个 ArrayList,其中包含对包含各种数据量的对象的引用。

我希望按对象数据的某些元素对对象进行排序。

我使用collections.sort 以及定义新比较器的匿名类成功地做到了这一点。

我在创建的每个新比较器中都取得了成功,这导致了正确的排序顺序。

对于同一个 ArrayList,您如何制作一个比较器来提供 ArrayList 顺序的原始输入。我知道 ArrayList 保存了它们添加的对象的顺序,即插入顺序。但是在使用其他比较器对 ArrayList 进行排序之后,我将如何将 ArrayList 排序回原来的顺序?这是困扰我的一件事,我似乎无法弄清楚。

编辑:我应该澄清这是一个分配,其中的说明说包括一个默认/原始比较器来获取未排序的输入。鉴于我们提到的,这对我来说没有意义。 ArrayList 在添加时会保存插入顺序,但在排序时会丢失。我不明白如何创建一个比较器来对原始列表进行排序。

Edit2:我得到一个 ArrayList,它预计会存储一些对象,这些对象包含一些将被排序的数据元素,例如按他们的名字或他们的年龄。这个比较器很容易制作,我成功地做到了。该分配还需要一个原始比较器,以在插入数据时显示数据。现在这些比较器在方法调用中传递,其中该方法将在每个不同的比较器上使用 collections.sort。它要求首先使用原始比较器。

原始比较器的想法似乎完全不合逻辑。首先使用的事实,所以还没有进行其他排序,这使得它看起来只是为了适合调用方法来显示数据的参数列表。所以换句话说,我猜原来的比较器应该什么都不返回......?

【问题讨论】:

  • 我不确定我是否理解您发布的问题。上半场似乎与下半场完全无关。排序后先前的排序会丢失,因此无法返回插入顺序,因为没有任何跟踪。如果您需要跟踪,请不要对数组进行排序,而是创建一个列表副本并对其进行排序,保留原始列表。
  • 在排序之前克隆你的ArrayList以存储状态;并且您可以稍后使用该克隆副本。
  • 如果是家庭作业问题,请给出准确的措辞,不要用自己的话来描述。但是,请注意how do I ask homework questions? 线程,因为家庭作业问题通常是人为设计的,有时对于那些以您提出问题的语言谋生、尝试或习惯使用的人来说是无稽之谈(这感觉就像是废话类)

标签: java sorting arraylist


【解决方案1】:

它要求首先使用原始比较器。

这意味着比较器不需要恢复原来的顺序,这是没有任何意义的(不可能),但是当什么都不做用于排序,即保持原顺序不变。

引用sort()的javadoc:

这种排序保证稳定:相同的元素不会因为排序而重新排序。

这意味着如果您传入一个声称所有对象相等的比较器,则不会发生重新排序。

// Java 8 example using lambda expression
Collections.sort(list, (a,b) -> 0); // No-op. All elements compare equal

【讨论】:

  • 是的,我相信这是正确的方法,也是我最终要做的(我刚刚返回 0)。它的措辞似乎是要恢复秩序,我以为我有误会或完全错过了什么,因为它没有意义。但在我完成之前,初始程序的结构方式并不是“恢复秩序”。
【解决方案2】:

除了进行克隆(上面已评论)之外,对象还包含一个单独的字段,该字段跟踪插入数组中的顺序并为此编写一个比较器。

【讨论】:

  • 是的,可悲的是,在我的情况下,这两者都不允许。我认为它只是一个空间持有者,因此可以调用该方法,因为它期望通过比较器。不可能是别的……
  • 那么您很可能无法克隆原始集合
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 2013-05-03
相关资源
最近更新 更多