是否可以在不实现Comparable类的情况下使用Comparator?例如,如果我有以下内容:
MyClass {
Comparator comp;
OrderedListInheritance(Comparator c) {
this.comp = c;
}
}
Run Code Online (Sandbox Code Playgroud)
我可以使用comp来比较两个对象吗?如果是这样,我将如何做到这一点?
谢谢...
我有一个java People对象:
public class People {
String lastname;
String firstname;
String gender;
String datebirth;
String fcolor;
public People(String lastname, String firstname, String gender,String datebirth, String fcolor) {
this.lastname = lastname;
this.firstname = firstname;
this.gender = gender;
this.datebirth = datebirth;
this.fcolor = fcolor;
}
public String getLastname() {
return lastname;
}
public String getFirstname() {
return firstname;
}
public String getGender() {
return gender;
}
public String getFcolor() {
return fcolor;
}
public String getDatebirth() {
return datebirth;
}
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个Comparator来比较datebirth(datebirth有时采用这种格式"2/13/1943",有时采用这种格式"2-13-1943",你能帮我解决一下如何实现它. …
我正在尝试从CLRS实现Dijsktra的算法 - 算法入门书,但是,我在实现带Comparator接口的优先级队列方面遇到了麻烦.这是我的Vertex课程,你可以看到;
public class Vertex {
public boolean explored;
public int vertexID;
public LinkedList<Vertex> adjacencyList;
public LinkedList<Edge> edgeSet;
public int shortestDistance;
public Vertex predecessor;
public Vertex(int vertexID){
this.vertexID = vertexID;
this.explored = false;
this.adjacencyList = new LinkedList<>();
this.edgeSet = new LinkedList<>();
this.shortestDistance = Integer.MAX_VALUE;
this.predecessor = null;
}
}
Run Code Online (Sandbox Code Playgroud)
所以最初shortestDistance属性被声明为Integer.MAX_VALUE.此外,您可以看到从Comparator实现的类用于优先级队列.
public class WeightComparator implements Comparator<Vertex> {
@Override
public int compare(Vertex o1, Vertex o2) {
return Math.min(o1.shortestDistance, o2.shortestDistance);
}
}
Run Code Online (Sandbox Code Playgroud)
我确信整个实现由于我的一些测试没有任何逻辑错误,但是,在某些测试中它失败了.我用这个语句创建了对队列的引用
PriorityQueue<Vertex> queue = …
我正在尝试读取文件,并比较字符串长度.如果两个字符串长度相同,那么我想按自然排序顺序(按字母顺序)对它们进行排序.
这是我正在研究的比较器的片段.一切都完整,减去排序相同长度的字符串.
Collections.sort(s, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
});
Run Code Online (Sandbox Code Playgroud)
感谢任何输入或adivce
我试图通过TreeSet使用自定义比较器.但是,似乎有些不对劲.无论我是使用自定义等于还是来自比较器的比较,我都会看到重复.任何想法错在哪里?以下是代码:(请查看以下评论)
import java.util.ArrayList;
import java.util.Comparator;
import java.util.TreeSet;
public class TreemapTest {
public static void main(String[] args) {
//Take an array of integers
int list[] = { 1,2,3,4,2,4,2,5 };
//Create a list of custom objects
ArrayList<Element> elements = new ArrayList<Element>();
//Populate the list with values from int array
for (int v : list){
elements.add(new Element(v));
}
/** Attempt to create a treeset from the arraylist */
// Create the Treeset with custom comparator
TreeSet<Element> nt = new TreeSet<Element>(new Comparator<Element>(){
public int …Run Code Online (Sandbox Code Playgroud) 我试图更好地理解Java中的比较器接口如何与对象和类交互.
我有一个未排序单词的字符串数组.我想将该数组复制到第二个数组,并仅按字母顺序排列第二个数组.
当我调用Array.sort方法并将第二个数组和比较器对象作为参数传入时, 两个数组最终都按字母顺序排序,我不明白为什么????
这是一个例子:
import java.util.Arrays;
import java.util.Comparator;
public class test2 {
public static void main(String[] args) {
// first array is unsorted
String[] words_unsorted = { "the", "color", "blue", "is", "the",
"color", "of", "the", "sky" };
// copy array to another array to be sorted
String[] words_sorted = words_unsorted;
// instantiate a reference to a new Comparator object
Comparator<String> listComparator = new Comparator<String>() {
public int compare(String str1, String str2) {
return str1.compareTo(str2);
}
}; …Run Code Online (Sandbox Code Playgroud) 我正在从Java 6迁移到Java 8,并注意到Comparator接口特有的一些东西.对此的任何见解都会非常有帮助.
当我切换到Java 8时,对象的顺序在"compare"方法内切换,列表排序失败.我回到java 6,它工作得很好.这是一个测试用例,使用Java 8失败了,并且使用了Java 6.
public class ComparitorTest {
@Test
public void comparatorTest(){
Record record1 = new Record("First", false);
Record record2 = new Record("Second", true);
List<Record> list = new ArrayList<Record>();
list.add(record1);
list.add(record2);
final Comparator<Object> recordComparator = new Comparator<Object>()
{
public int compare( Object o1, Object o2 )
{
Record r1 = (Record) o1;
Record r2 = (Record) o2;
Boolean isReadonly_R1 = r1.getIsReadOnly();
Boolean isReadOnly_R2 = r2.getIsReadOnly();
if( isReadonly_R1.equals( Boolean.TRUE ) )
{
return 0;
}
else
{ …Run Code Online (Sandbox Code Playgroud) 我有一个比较器,它检查是否有任何字符串为null并返回-1.如果它们不为null,则进行比较.我希望使用lambda函数实现它.
这是代码:
private SortedSet<Student> studentSet() {
return new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
if(s1.getName() == null) {
return -1;
}
if(s2.getName() == null) {
return 1;
}
return s1.getName().compareToIgnoreCase(s2.getName());
}
});
}
Run Code Online (Sandbox Code Playgroud)
我知道如何使用lambdas返回一个简单的比较器.我对如何实现上面的代码很困惑.
我的问题是我想比较一些不使用字母排序的字符.这是我的订单关系:A <B <T <Q <C <D <E <F ...
如何为此创建比较器?我必须写下这样的所有案例:
if (char1.equals(char2)) {
return 0;
} else if (char1.equals("A")) {
return -1;
} else if (char1.equals("B") && char2.equals("A")) {
return 1;
} else if (char1.equals("T")
&& (char2.equals("B") || char2.equals("A"))) {
return 1;
} else if (char1.equals("Q")
&& (char2.equals("T") || char2.equals("B") || char2
.equals("A"))) {
return 1;
} else if (char1.equals("C")
&& (char2.equals("Q") || char2.equals("T")
|| char2.equals("B") || char2.equals("A"))) {
return 1;
} else if (char1.equals("D")
&& (char2.equals("C") || char2.equals("Q")
|| …Run Code Online (Sandbox Code Playgroud) 我在本课题中遇到的错误已经解决,并在下面的答案部分写下.
问题是TreeMap的下面定义抛出了编译错误,我想知道原因.
Comparator<Student> comparator=new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// TODO Auto-generated method stub
if(o1.roll<=o2.roll)
return -1;
else return 1;
}
};
TreeMap<Integer, Student> map=new TreeMap<>(comparator);
Run Code Online (Sandbox Code Playgroud)
我不明白Treemap的实现错误的原因.有谁能解释一下这里发生了什么?
comparator ×10
java ×10
sorting ×3
java-8 ×2
arrays ×1
char ×1
collections ×1
comparable ×1
date ×1
java-6 ×1
lambda ×1
performance ×1
string ×1
treemap ×1
treeset ×1