Tag: 比较器

制作通用比较器类

我正在尝试制作一个比较器,可以将任何类型的元素进行比较。 我不确定如何创建课程。 我只是想让它比较同一类型的两个元素(但客户端提供它的任何类型,例如:Integer,String,Double等等),以查看哪一个大于另一个。 public class InsertionComparator implements Comparator { /** * Compares two elements. * * @param f1 The first element you want to compare. * @param f2 The second element you want to compare. * @return -1,0,1 Whether or not one is greater than, less than, * or equal to one another. */ public […]

根据运行时属性对对象列表进行排序

我有一个VO的arraylist。 这些对象具有许多属性和相应的get / set方法。 我想基于我将在运行时获得的属性对此数组列表进行排序。 让我详细解释一下。 我的VO是这样的 public class Employee { String name; String id; private String getName() { return name; } private String getId() { return id; } } 我将在运行时获得一个字符串’sortType’,它可以是’id’或’name’。 我想根据字符串的值对列表进行排序。 我试图一起使用比较器和reflection,但没有运气。 可能是我没有正确使用它。我不想使用if循环并创建新的比较器类。 还有其他想法吗? try catch应该在新类中。 这是工作代码。 如果你想为比较器使用一个单独的类,请在@ Bohemian的评论中找到它。 String sortType = “name”; // determined at runtime Collections.sort(results, new Comparator() { public int compare(Employee […]

为什么不必在Java中覆盖接口Comparator的两种方法

我们知道,如果我们想要创建该类的对象,则必须实现接口的所有方法。 但是为什么没有必要在java中实现接口Comparator compare()和equals()方法呢? 我同意目的已经解决,但即使那样,如果我们覆盖compare (),为什么不强制重写equals ()?

比较器最佳实践

如果我实现一个自定义比较器,除了compare之外,它是否被认为是优秀的做法? 另外还有Comparator的定义合同吗?

Guava:如何从List和单个元素创建显式排序?

在Guava中,如果我知道Collection和Collection类型的元素e在集合中,我想创建一个自定义Ordering ,首先对e进行排序,然后对集合的其余部分进行排序。 然而,到达那里的方式似乎非常复杂: Collection values = ImmutableList.of(“apples”, “oranges”, “pears”); String first = “oranges”; List remainingValues = newArrayList(values); // this remainingValues.remove(first); // seems Ordering myOrdering = // very Ordering.explicit(first, remainingValues.toArray( // complicated! new String[remainingValues.size()])); // is there an easier way? 我想要的是这样的事情: Ordering.explicit(first); (我希望这首先排序到开头并保留所有其他元素的顺序,但是文档说生成的Ordering会为未明确列出的元素抛出ClassCastException 。) 或者像这样: Ordering.explicit(first, values.toArray(/* etc */)); (但这会失败,因为first是重复值) 有人能想出一个简洁的方法来做我想做的事吗? 顺便说一句,它不一定是一个Ordering ,它也可能是在指定的Order中创建Iterable一种解决方法,但同样,这非常复杂: Iterable sorted = […]

如何编写通用比较器,可以对所有必要的字段进行排序?

我需要在我class级的所有领域实现排序,我为class上的每个领域编写了一个比较器。 但我必须为每个字段编写一个单独的比较器。 我认为这不是很正确。 如何为我的class级写一个通用比较器,可以对所有领域进行排序? 我的实体: public class User { private long id; private String name; private int age; ………………… 我的比较器: public class UserComparatorById implements Comparator { public int compare(User user1, User user2) { int result = (int)(user1.getId() – user2.getId()); if (result != 0) return (int)(result/Math.abs(result)); result = user1.getName().compareTo (user2.getName()); if (result != 0) return (int)(result/Math.abs(result)); […]

Java流排序2变量升序/取消发送

我想排序seq1升序和seq2降序所以我这样做: list = list.stream().sorted(comparing(AClass::getSeq1).thenComparing( AClass::getSeq2).reversed()).collect(toList()); 但结果出来了,因为seq1和seq2都按降序排序。 我可以这样做以使seq1升序和seq2降序: sorted(comparing(AClass::getSeq1) .reversed().thenComparing(AClass::getSeq2).reversed() 这是真正的正确方法吗?

Java的Collections.sort(列表,比较器)的排序顺序是什么? 从小到大还是从大到小?

显然,它没有记录,或者我错过了它。 这是文档的链接,下面是文本的图像: 编辑 (17/5):我认为太多人把这个问题混淆为比较问题。 它不是。 比较器比较2个元素。 根据那个比较,列表排序。 怎么样? 升序还是降序? 我将进一步细化/简化问题:如果比较器确定元素A小于元素B. 在排序列表中 ,元素A是否位于比元素B小的索引处?

为什么在java.util.Comparator中实现equals不是必须的?

无论是在Javadoc中还是在代码本身中,Comparator接口都定义了: int compare(T o1, T o2); boolean equals(Object obj); 但是这不会给probs编译: Comparator a = new Comparator() { @Override public int compare(Object o1, Object o2) { //.. } }; 但这样做: Comparator a = new Comparator() { @Override public boolean equals(Object comparator) { //.. } }; 它是如何为接口完成的,允许我们不要覆盖方法?

按预定义的自定义顺序排序字符串列表

我有这个项目,程序会询问用户应该运行多少次。 在每次运行期间,将创建一个列表并添加元素。 数组中的这些元素按字母顺序排序,但按以下顺序排序: q,w,e,r,t,y,u,i,o,p,l,k,j,h,g,f,d,s,a,z,x,c,v,b,n,m 我可以运行我的程序直到它接受输入,但我不知道接下来该做什么… 样本输入 2 3 what are you 2 sad set 样本输出 what you are set sad 这是我的代码: import java.util.*; public class WeirdWritings { public static void main(String[] args) { int data,word,ctr,i,ii; char[] rLetter = {‘Q’,’W’,’E’,’R’,’T’,’Y’,’U’,’I’,’O’,’P’,’L’,’K’,’J’,’H’,’G’,’F’,’D’,’S’,’A’,’Z’,’X’,’C’,’V’,’B’,’N’,’M’}; String entry; Scanner s = new Scanner(System.in); data=s.nextInt(); for (ctr=0;ctr<rLetter.length;ctr++) System.out.print(rLetter[ctr]); System.out.println(); for (ii = 0; […]