- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
美好的一天-
我正在执行一项任务,其中我有指令创建一个名为 void sortByAthleteNames()
的方法,该方法将执行以下任务:
按名字和姓氏对运动员对象列表进行排序。此方法调用 Sorts 类中定义的排序方法,使用 AthleteNameComparator 类的对象作为其第二个参数
Sorts 类具有以下实现:
public class Sorts {
public static void sort(ArrayList<Athlete> objects,Comparator<Athlete> comparator)
{
//TODO
}
}
您的排序方法利用参数 Comparator 对象的比较方法来排序。您可以使用选择排序或插入排序之一。
sortByAthleteNames()方法实现:
public void sortByAthleteNames() {
AthleteNameComparator athleteNameComparator = new AthleteNameComparator();
Sorts.sort(athleteList, **CONFUSED WHAT TO PASS HERE**);
}
而 AthleteNameComparator 类具有以下指令:
AthleteNameComparator 类实现“Comparator”接口(interface)。它需要定义以下方法,该方法是从 Comparator 接口(interface)继承的抽象方法:
public int Compare(对象第一,对象第二)(请注意,您还可以定义:public int Compare(运动员第一,运动员第二)相反,让类实现 Comparator。
为此,我创建了一个类,如下所示:
运动员姓名比较器
public class AthleteNameComparator implements Comparator<Athlete>{
@Override
public int compare(Athlete o1, Athlete o2) {
// TODO Auto-generated method stub
return 0;
}
}
此外,我们还有以下指令,我们需要用相同的方法来实现它,如下所示:
如果第一个参数对象的姓氏按字典顺序小于第二个参数的姓氏,则返回小于零的 int。如果第一个参数对象的姓氏按字典顺序大于第二个参数的姓氏,则返回大于零的 int。如果他们的姓氏相同,那么应该比较他们的名字。如果他们的名字和姓氏相同,则应返回 0。
我在这里很困惑。我的问题是如何执行关系运算符,因为 LastName 的 datatype
是 String
并返回 -1/1 或 0。我已经搜索了很多,根据我的了解这就是我可以比较这些的方式。请确认这是正确的方法吗?
public class AthleteNameComparator{
public int compare(Athlete a1, Athlete a2) {
if(a1.getLastName().hashCode() < a2.getLastName().hashCode())
{
return -1;
}
else if(a1.getLastName().hashCode() > a2.getLastName().hashCode())
{
return 1;
}
else if(a1.getLastName().hashCode() == a2.getLastName().hashCode())
{
if(a1.getFirstName().hashCode() == a2.getFirstName().hashCode())
{
return 0;
}
}
return 100;
}
}
但是我们为什么要这样做呢?我们用 -1/1 或 0 可以实现什么。您还可以解释一下它是如何工作的吗?我需要首先处理哪些事情,当我从 compare()
方法获得成功响应时,我如何在插入或选择排序中使用返回的值。
非常感谢
最佳答案
使用比较器进行排序是 Java 中的标准操作。了解其工作原理以及原因 compare
方法必须返回负/正/0 值,在网络和/或教科书中查找教程和其他资源。
要求特定的类名确实很愚蠢,如 AthleteNameComparator
,但假设这是一项学校作业,您可能应该按照它去做。
排序的调用很简单:
Sorts.sort(athleteList, athleteNameComparator); // **SEE WHAT TO PASS HERE**
你的骨架AthleteNameComparator
是正确的。您可以填写如下方法:
@Override
public int compare(Athlete o1, Athlete o2) {
int diffLastName = o1.getLastName().compareTo(o2.getLastName());
if (diffLastName == 0) { // last names are equal
return o1.getFirstName().compareTo(o2.getFirstName());
} else {
return diffLastName;
}
}
一旦掌握了窍门,编写比较器就很容易了:您只需将任务传递(委托(delegate))给适当的compareTo
即可。 (很少使用另一个比较器的 compare
方法),它将返回正确的负值、正值或 0 值。只要将左侧 ( o1
) 和右侧 ( o2
) 保持在正确的位置,您甚至不必跟踪哪个是哪个。
如果不是类名的要求,sortByAthleteNames()
只需几行代码即可编写,包括比较器(假设是 Java 8):
public void sortByAthleteNames() {
Sorts.sort(athleteList, Comparator.comparing(Athlete::getLastName).thenComparing(Athlete::getFirstName));
}
如果我理解正确的话,您面前仍然有大部分工作:实现Sorts.sort()
。如果您从使用 e1 < e2
比较元素的排序算法开始,您必须将其替换为 comparator.compare(e1, e2) < 0
。始终使用与原始算法相同的关系运算符,它应该会顺利进行。
希望有帮助。
关于java - 使用比较器<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40056568/
我对这个错误很困惑: Cannot implicitly convert type 'System.Func [c:\Program Files (x86)\Reference Assemblies\
考虑这段代码: pub trait Hello { fn hello(&self); } impl Hello for Any { fn hello(&self) {
问题很简单。是否可以构造这样一个类型 T,对于它下面的两个变量声明会产生不同的结果? T t1 = {}; T t2{}; 我已经研究 cppreference 和标准一个多小时了,我了解以下内容:
Intellij idea 给我这个错误:“Compare (T, T) in Comparator cannot be applied to (T, T)” 对于以下代码: public class
任何人都可以告诉我 : n\t\t\t\t\n\t\t\t 在以下来自和 dwr 服务的响应中的含义和用途是什么. \r\n\t\t\t \r\n\t\t\t
让 T 成为一个 C++ 类。 下面三个指令在行为上有什么区别吗? T a; T a(); T a = T(); T 为不带参数的构造函数提供了显式定义这一事实是否对问题有任何改变? 后续问题:如果
Rust中的智能指针是什么 智能指针(smart pointers)是一类数据结构,是拥有数据所有权和额外功能的指针。是指针的进一步发展 指针(pointer)是一个包含内存地
比如我有一个 vector vector > v={{true,1},{true,2},{false,3},{false,4},{false,5},{true,6},{false,7},{true,8
我有一个来自 .xls 电子表格的数据框,我打印了 print(df.columns.values) 列,输出包含一个名为:Poll Responses\n\t\t\t\t\t。 我查看了 Excel
This question already has answers here: What are good reasons for choosing invariance in an API like
指针类型作为类型前缀与在类型前加斜杠作为后缀有什么区别。斜线到底是什么意思? 最佳答案 语法 T/~ 和 T/& 基本上已被弃用(我什至不确定编译器是否仍然接受它)。在向新向量方案过渡的初始阶段,[T
我正在尝试找到一种方法来获取模板参数的基类。 考虑以下类: template class Foo { public: Foo(){}; ~Foo(){};
这是一个让我感到困惑的小问题。我不知道如何描述它,所以只看下面的代码: struct B { B() {} B(B&) { std::cout ::value #include
为什么有 T::T(T&) 而 T::T(const T&) 更适合 copy ? (大概是用来实现move语义的???) 原始描述(被melpomene证明是错误的): 在C++11中,支持了一种新
在 Java 7 中使用 eclipse 4.2 并尝试实现 List 接口(interface)的以下方法时,我收到了警告。 public T[] toArray(T[] a) { ret
假设有三个函数: def foo[T](a:T, b:T): T = a def test1 = foo(1, "2") def test2 = foo(List(), ListBuffer()) 虽
我对柯里化(Currying)和非柯里化(Currying)泛型函数之间类型检查的差异有点困惑: scala> def x[T](a: T, b: T) = (a == b) x: [T](a: T,
考虑一个类A,我如何编写一个具有与相同行为的模板 A& pretty(A& x) { /* make x pretty */ return x; } A pretty(A&& x) {
Eclipse 表示由于泛型类型橡皮擦,类型参数不允许使用 instanceof 操作。 我同意在运行时不会保留任何类型信息。但是请考虑以下类的通用声明: class SomeClass{ T
在 C++14 中: 对于任何整数或枚举类型 T 以及对于任何表达式 expr: 有没有区别: struct S { T t { expr }; }; 和 struct S { T t = { exp
我是一名优秀的程序员,十分优秀!