Tag: 比较器

对CaseInsensitiveComparator的实现感到好奇

当我检查CaseInsensitiveComparator的实现时,它是String私有内部类,我发现了奇怪的事情。 private static class CaseInsensitiveComparator implements Comparator, java.io.Serializable { … public int compare(String s1, String s2) { int n1 = s1.length(); int n2 = s2.length(); int min = Math.min(n1, n2); for (int i = 0; i < min; i++) { char c1 = s1.charAt(i); char c2 = s2.charAt(i); if (c1 != c2) { c1 = […]

具有多个字段的对象的Java Comparator

我有一个包含5个字段的Object Collection : id; entityType; entityId; brandId; productId; 要对Collection的ArrayList进行排序,我编写了以下Comparaor 。 Comparator collectionComparator = new Comparator() { @Override public int compare(Collection collection1, Collection collection2) { if(collection1.getId().equals(collection2.getId())) { if(collection1.getEntityType().equals(collection2.getEntityType())) { if(collection1.getEntityId().equals(collection2.getEntityId())) { if(collection1.getBrandId().equals(collection2.getBrandId())) { return collection1.getProductId().compareTo(collection2.getProductId()); } else { return collection1.getBrandId().compareTo(collection2.getBrandId()); } } else { return collection1.getEntityId().compareTo(collection2.getEntityId()); } } else { return collection1.getEntityType().compareTo(collection2.getEntityType()); } } return collection1.getId().compareTo(collection2.getId()); […]

同时对两个arrayLists进行排序

假设我有两个ArrayLists: name: [Four, Three, One, Two] num: [4, 3, 1, 2] 如果我这样做:Arrays.sort(num),那么我有: name: [Four, Three, One, Two] num: [1, 2, 3, 4] 有没有什么方法可以对num进行排序并将其反映在名称中,这样我最终可能会: name: [One, Two, Three, Four] num: [1, 2, 3, 4] ? 请帮帮我。 我想到了比较器和物体,但根本不知道它们。

比较器工作方式的效率

我试图使用比较器来帮助排序对象列表。 我有一个问题,关于比较器的确切工作原理以及它在以下示例中的作用: private static Comparator comparator() { return (Student a, Student b) -> { return Integer.compare(complexOperation(a), complexOperation(b)); } } 如您所见,需要根据complexOperation()方法返回的整数等级对学生进行比较和排序。 顾名思义,这是一项繁重的操作。 上述方法是否最有效? 或者,最好是按照我要排序的列表中的每个学生进行操作,对每个学生执行complexOperation()并将结果存储在Student对象的字段中。 然后比较器会做一个: Integer.compare(a.getRank(), b.getRank()) 这两种方法是否具有可比性,或者由于比较器的工作方式(可能比较同一个对象不止一次,因此在比较期间每个学生多次运行complexOperation()),是否可以更快地进行预计算complexOperation()会导致学生领域? 以上将被称为如下: Collections.sort(students, comparator()); 希望很清楚! 编辑:让我们说,为了它,不可能在Student对象中添加一个字段(对于一个更复杂的情况,这是一个玩具问题,我无法自由修改Student对象)。 是否仍然可以更好地创建一个自定义对象,其中学生坐在里面添加另一个字段而不是在比较器中执行complexOperation()? 或者还有另一种解决问题的方法吗? 我可以考虑创建一个Hashmap,它将student id作为键,complexOperation()的结果作为值,只是在比较器中创建/访问该记录?

使用Comparator接口和java 8 Streams进行排序

Parent是Childinheritance的类。 这是GrandChildinheritance的。 每个类都包含子类的List(即Parent包含Child和Child的List包含GrandChild的List)。 每个类包含50个属性(attrib1-atrib50)。 getChildList()返回类型为Child的对象的arrayList getGrandChildList()返回类型为GrandChild的对象的arrayList 设resultSet为Parent列表 List resultSet 现在我想根据一些属性对列表进行排序。 例如,如果我想基于两个父属性(比如属性1和属性2)对resultSet进行排序,我使用此代码。 Comparator byFirst = (e1, e2) -> e2.getAttrib1().compareTo(e1.getAttrib1()); Comparator bySecond = (e1, e2) -> e1.getAttrib2().compareTo(e2.getAttrib2()); Comparator byThird = byFirst.thenComparing(bySecond); List sortedList = resultSet.stream().sorted(byThird) .collect(Collectors.toList()); 现在我想根据Child类的属性1和GrandChild类的属性1对父列表进行排序。 我应该如何排序呢。

用于多列排序的Java比较器?

是否有任何Java开源比较器用于比较多个字段的bean以进行多列排序? 每列可以按升序或降序排序。 对于单列排序,可以通过将org.apache.commons.beanutils.BeanComparator与org.springframework.util.comparator.InvertibleComparator一起使用来org.springframework.util.comparator.InvertibleComparator 。 我知道这个function写起来非常简单,但重新发明轮子的好处是什么,如果它已经编写和测试过了?

无论如何,将空值排序到底部的一般方法很好吗?

我正在编写一些自定义比较器,我希望它们将空项目推送到列表的底部,无论我是按升序还是降序排序。 接近这个的好策略或模式是什么? 随口说说: 只需编写单独的升序和降序比较器,尽可能共享代码 通过抛出NPE或通过显式调用来将null处理委托给另一个类 包含一个升序标志并在其中放置条件逻辑以导航空值 在null处理类中包装常规比较器 还有其他策略吗? 我想听听有关不同方法的任何经验,以及各种策略的任何缺陷。

如何使用Comparator接口

我是java的新手,我并没有真正了解如何使用比较器接口。 我在Inventory类和Item类中有一个Item的ArrayList 。 在我写的Item类中: public class Item implements Comparator { //stuff … @Override public int compare(Item a, Item b) { if (a.getID().compareToIgnoreCase(b.getID())>0) return 1; else if (a.getID().compareToIgnoreCase(b.getID())<0) return -1; else return 0; } } getID()方法只提供id,我必须使用它来按字母顺序排列项目。 我不确定这是不对的,它让我把@Override注释,我不知道为什么。 我还写了一个界面,只是说: public interface Comparator { int compare(Item a, Item b); } 我不确定那一点。 另外,我如何实现此方法来对库存类中创建的arraylist进行排序? 谢谢,如果我的问题没有意义或需要澄清,请告诉我。

Java比较器:两个排序标准

我有一个包含字符串(名称)和整数(年龄)的简单类。 应存储在集合中的对象不得具有双重名称值,并应根据年龄下降进行排序。 第一个代码示例删除所有双重名称,但不包含第二个排序标准: public int compare(Person p1, Person p2) { int reVal = 1; if(p1.getName().compareTo(p2.getName()) != 0){ reVal = 1; } else { reVal = 0; } return reVal; } 下一个示例比较器应该对其余的对象集进行排序,这些对象不包含任何双重名称: public int compare(Person p1, Person p2) { boolean ageGt = (p1.getAge() > p2.getAge()); int reVal = 1; if(p1.getName().compareTo(p2.getName()) != 0){ if(scoreGt) reVal = -1; […]

用Java实现卡片组

所以我有一个实验室(我们被允许寻求外界的帮助,所以我在这里经过多次努力)我们必须实施一副卡片。 我们必须使用枚举类来创建num 适合西装: public enum Suits { CLUBS, HEARTS, DIAMONDS, SPADES } 对于数字: public enum Numerals { DEUCE(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGHT(8), NINE(9), TEN(10), JACK(11), QUEEN(12), KING(13), ACE(14); } 我的卡类非常简单,但我不确定这两个代码块: public int compareTo (Card aCard){ if (aCard.aNumeral.equals(this.aNumeral) && aCard.aSuit.equals(this.aSuit)){ return 0; } else { return -1; } } 和 public boolean equals (Card […]