Tag: 比较器

无法将列比较器设置为JTable

在另一个线程中,我找到了这个比较器(post的底部),用于对JTable列进行排序,这些列可以由整数,字符串或两者组成。 我无法弄清楚如何将它应用于我的JTable。 我的表之前使用过自动创建的行排序器。 我将其设置为false,我现在正在使用: TableRowSorter rowSorter = new TableRowSorter(); jtable.setRowSorter(rowSorter); rowSorter.setComparator(0, c1); 我得到一个索引超出范围的例外,说我提供的无效范围。 我的表有多列。 这是应用比较器的正确方法吗? 我觉得这不是这样做的方法。 Comparator c1 = new java.util.Comparator() { /** * Custom compare to sort numbers as numbers. * Strings as strings, with numbers ordered before strings. * * @param o1 * @param o2 * @return */ @Override public int compare(Object oo1, […]

Java:PriorityQueue从自定义比较器返回错误的排序?

我编写了一个自定义比较器来比较我的节点类,但是java优先级队列没有以正确的顺序返回我的项目。 这是我的比较器: public int compare(Node n1, Node n2){ if (n1.getF() > n2.getF()){ return +1; } else if (n1.getF() < n2.getF()){ return -1; } else { // equal return 0; } } 其中getF返回一个double。 但是,在将多个节点插入优先级队列后,我将其打印出来: while(open.size() > 0) { Node t = (Node)(open.remove()); System.out.println(t.getF()); } 结果如下: 6.830951894845301 6.830951894845301 6.0 6.0 5.242640687119285 7.4031242374328485 7.4031242374328485 8.071067811865476 任何想法为什么会这样? 我的比较器错了吗? 谢谢。 […]

为什么Comparator.comparing不能与String :: toLowerCase方法引用一起使用?

我试图通过逆序(忽略大小写)排序一个字符串数组,而不修改它,只打印它。 所以我使用的是Java8流。 但我无法做到这一点。 这是我的尝试: package experimentations.chapter02; import java.util.Arrays; import java.util.Comparator; import java.util.stream.Collectors; public class StringStream { public static void main(String[] args) { sortStrings(); } public static void sortStrings(){ String[] stringsArray = “The quick brown fox has a dirty ladder”.split(“\\s+”); System.out.println( Arrays.stream(stringsArray) .sorted(Comparator.comparing(String::toLowerCase).reversed()) .collect(Collectors.toList()) ); } } 这里的问题是静态方法Comparator.comparing不接受String::toLowerCase 。 同时,我设法对数组进行排序,但修改它: public static void sortStrings(){ String[] stringsArray […]

Java中的可比较和比较器接口

我想写一个通用的Pair类,它有两个成员:key和value。 这个类的唯一要求是key和value都应该实现Comparable接口,否则Pair类不会接受它们作为类型参数。 首先,我这样编码: public class Pair 但是JDK 1.6编译器会生成关于此的警告: Comparable is a raw type. References to generic type Comparable should be parameterized 然后我尝试添加类型参数,现在代码如下所示: public class Pair<T1 extends Comparable, T2 extends Comparable> 现在一切顺利,直到我尝试为Pair生成Comparator。(以下代码在Pair类中) public final Comparator<Pair> KEY_COMPARATOR = new Comparator<Pair>() { public int compare(Pair first, Pair second) { *first.getKey().compareTo(second.getKey());* return 0; } }; 代码first.getKey().compareTo(second.getKey()); 会产生错误说: The method […]

Java,如果compareTo()返回0,为什么暗示对象是相等的?

我们有一个Person 。 人有名字和身高。 Equals和hashCode()仅考虑名称。 人是可比的(或者我们为它实施比较,无论哪一个)。 人员按身高进行比较。 期望两个不同的人可以具有相同高度的情况似乎是合理的,但是例如。 TreeSet的行为类似于comapareTo()== 0表示等于,而不仅仅是相同的大小。 为了避免这种情况,如果大小相同,比较可以继续查看其他内容,但是它不能用于检测相同大小的不同对象。 例: import java.util.Comparator; import java.util.HashSet; import java.util.Objects; import java.util.Set; import java.util.TreeSet; public class Person implements Comparable { private final String name; private int height; public Person(String name, int height) { this.name = name; this.height = height; } public int getHeight() { return height; } public […]

比较器和等号()

假设我需要使用某些域逻辑排序的元素的TreeSet 。 通过这个逻辑,一些元素的顺序并不重要,因此比较方法可以返回0,但在这种情况下我不能将它们放在TreeSet 。 所以,问:我将从这样的代码中得到什么缺点: class Foo implements Comparable{} new TreeSet(new Comparator(){ @Override public int compare(Foo o1, Foo o2) { int res = o1.compareTo(o2); if(res == 0 || !o1.equals(o2)){ return o1.hashCode() – o2.hashCode(); } return res; } }); 更新 : 好。 如果它应该始终是方法equals() , hashcode()和compareTo()之间的一致性,如@SPFloyd – seanizer和其他人说。 如果我将删除Comparable接口并在Comparator移动此逻辑(我可以在没有破坏封装的情况下完成它)会更好甚至更好吗? 所以它将是: class Foo{} new TreeSet(new Comparator(){ @Override public […]

为什么比较器声明等于?

Comparator接口有自己的equals()方法。 默认情况下,任何类都将通过Object类获得equals() 。 在接口中有什么需要equals()方法?

比较方法违反了其一般合同的例外

下面是一个代码块,导致exception,如图所示, 代码: Collections.sort( arrayList, new Comparator() { public int compare( Object o1, Object o2 ) { TypeAdapterSort tas1 = ( TypeAdapterSort ) o1; TypeAdapterSort tas2 = ( TypeAdapterSort ) o2; if ( tas1.order < tas2.order ) return -1; else return 1; } } ); 例外: java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.TimSort.mergeLo(TimSort.java:747) at […]

将Java PriorityQueue转换为稳定的优先级队列

我正在尝试在Java中实现稳定(先进先出)优先级队列。 假设密钥是一个名称,值是一个年龄,我知道我可以像这样建立一个不稳定的优先级队列: Queue<Map.Entry> pq = new PriorityQueue<Map.Entry>(100, ageComparator); 这几乎可以满足我所需要的一切,除了它在我插入(或删除它们)时不保持键值对的顺序。 我通过创建一个LinkedList找到了“解决方法”,它实际上提供了所有相同的function,除了它不包含带比较器选项的构造函数,我觉得它必须更慢,因为我保持值排序通过在每个队列操作后调用Collections.sort() 。 所以我想我真的有两个选项让我感兴趣。首先,我如何编辑上面的PriorityQueue来维护插入和删除顺序? 或者,我怎样才能强制我的LinkedList选项立即使用比较器而不必在每次操作时调用排序? 谢谢! 编辑: 感谢发布的第一条评论中的好问题。 通过FIFO,我的意思是对于具有相等值的键值对,应首先提取首先放入的对。

如何使用Collections和Comparator按升序对ArrayList进行排序

如何使用Comparator按升序对ArrayList进行排序? 我知道如何使用以下降顺序对其进行排序: Comparator mycomparator = Collections.reverseOrder(); 然后 Collections.sort(myarrayList,mycomparator); 只是想知道如何使用集合和比较器按升序对其进行排序? 谢谢!