- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Java 1.7 和 Eclipse Juno。
我有一个对象列表,可以按对象的任何一个属性进行排序。为了完成排序,我将每个对象的列表索引以及选择作为排序的属性值放入映射中。那么 map 就是sorted by value然后通过查找原始列表中的对象并将它们添加到新列表中来组装一个新列表。
还有其他方法可以按不同的属性对列表进行排序,但这是我正在清理的一些代码所采用的方法,并且我不能对其进行太大的更改(它是数千个单一方法的一部分)行很长,有很多实际上是全局变量的内容。我会在时间允许的情况下进行重构,但没有测试,所以进展缓慢)。
我想避免显式类型转换、原始类型和未经检查的转换/调用。
下面的程序说明了这个想法。它可以工作,但会产生原始类型和未经检查的转换警告。我可以抑制警告,但我更希望有一种方法可以声明它,使其不会生成警告并且与 sortByValue()
兼容。功能。
此外,我在写作时注意到:
Map<Integer,Comparable> b = sortByValue(map);
for( Integer index : b.keySet()){
output.add(animals.get(index));
}
.keySet()
的类型是预期的Set<Integer>
。但如果我写:
for( Integer index : sortByValue(map).keySet()){
output.add(animals.get(index));
}
然后是.keySet()
的类型未参数化 Set
,并且我收到类型不匹配错误。我可以使用类型 Object 并将索引显式转换为 Integer,但我不明白为什么返回类型为 keySet()
应该是不同的。
package my.sandbox;
import java.util.*;
public class Main {
public static void main(String[] args) {
try {
test();
} catch (Exception e) {
e.printStackTrace();
}
}
// https://stackoverflow.com/a/2581754/145446
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) {
List<Map.Entry<K, V>> list = new LinkedList<Map.Entry<K, V>>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<K, V>>() {
public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
return (o1.getValue()).compareTo(o2.getValue());
}
});
Map<K, V> result = new LinkedHashMap<K, V>();
for (Map.Entry<K, V> entry : list) {
result.put(entry.getKey(), entry.getValue());
}
return result;
}
static class Animal {
String Name;
Double Weight;
Integer Age;
Animal(String n, Double w, Integer a){
Name = n;
Weight = w;
Age = a;
}
public String toString(){
return String.format("%10s : %6.1f %d", Name, Weight, Age);
}
}
private static void test() {
List<Animal> animals = new LinkedList<Animal>();
animals.add(new Animal("Spot", 35.4, 5));
animals.add(new Animal("Rover", 47.2, 3));
animals.add(new Animal("Phydeaux", 55.2, 4));
int sortOption = new Random(System.currentTimeMillis()).nextInt(3);
// ** Two 'raw types' warnings here
Map<Integer, Comparable> map = new HashMap<Integer, Comparable>();
for( Integer i =0; i<animals.size(); i++)
{
switch (sortOption) {
case 0 :
map.put(i, animals.get(i).Name);
break;
case 1 :
map.put(i, animals.get(i).Weight);
break;
case 2 :
map.put(i, animals.get(i).Age);
break;
}
}
List<Animal> output = new LinkedList<Animal>();
// ** One each 'raw types' and unchecked conversion warnings here
for( Object index : sortByValue(map).keySet()){
output.add(animals.get((Integer)index));
}
for( Animal s : output)
System.out.println(s);
}
}
编辑:
在探索了许多选项之后,我开始想知道为什么要使用这张 map 。我只需要以不同的方式比较对象,那么为什么不直接构建一个合适的比较器,然后直接对列表进行排序呢?
private static void test() {
List<Animal> animals = new LinkedList<Animal>();
animals.add(new Animal("Spot", 35.4, 5));
animals.add(new Animal("Rover", 47.2, 3));
animals.add(new Animal("Phydeaux", 55.2, 4));
final int sortOption = new Random(System.currentTimeMillis()).nextInt(3);
// Build a comparator for the specified sort
Collections.sort(animals, new Comparator<Animal>() {
public int compare(Animal o1, Animal o2) {
switch (sortOption){
case 0:
return (o1.Name).compareTo(o2.Name);
case 1:
return (o1.Weight).compareTo(o2.Weight);
case 2:
return (o1.Age).compareTo(o2.Age);
}
return 0;
}});
for( Animal s : animals)
System.out.println(s);
}
最佳答案
第一个原始类型警告告诉您发生了什么:一旦您尝试使用原始Comparable
,所有的赌注都会失败。最好的选择是将 map
的声明移动到 switch
语句中,而不是尝试在 for
循环和鞋拔子名称、权重内进行切换,并且年龄为同一类型。
关于java - 如何声明一个可以进行 Collections.sort()ed 的 Map<x,Comparable> 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20012338/
我在覆盖 ReSwift Pod 中的函数时遇到问题。我有以下模拟类(class): import Foundation import Quick import Nimble import RxSwi
我有一个类似于下面的继承结构。我正在采用 Printable 协议(protocol)并努力覆盖 description 属性。我遇到了一个谷歌此时似乎不知道的奇怪错误,提示为第三类,并引用了第二类和
我有一个类“Cat”和 Cat 类的一个子类“DerivedCat”。 Cat 有一个函数 meow(),而 DerivedCat 覆盖了这个函数。 在应用程序中,我声明了一个 Cat 对象: Cat
Kotlin 变量 变量是用于存储数据值的容器。 要创建一个变量,使用 var 或 val,然后使用等号(=)给它赋值: 语法 var 变量名 = 值 val 变量名 = 值 示例 va
C 中的所有标识符在使用前都需要声明,但我找不到它在 C99 标准中表示的位置。 我觉得也是指宏定义,不过定义的只是宏展开顺序。 最佳答案 C99:TC3 6.5.1 §2,脚注 79 明确指出: T
今天我的博客提要显示错误: This page contains the following errors: error on line 2 at column 6: XML declaration
在编写 IIF 语句、表和下面给出的语句时出现错误。 陈述: SELECT IIF(EMP_ID=1,'True','False') from Employee; table : CREATE TAB
我正在创建一个登录 Activity ,我希望它在按下登录按钮时显示进度对话框,我声明、初始化并调用了它,但它没有显示。但是当我在创建时调用进度对话框时,它出现了 这是我的代码: public cla
当我输入声明语句时: Vector distance_vector = new Vector(); 我收到错误(在两种情况下都在“双”下划线): Syntax error on token "doub
我正在本地部署在docker-for-desktop中。这样我将来可以迁移到kubernetes集群。 但是我面临一个问题。使用永久卷时,docker容器/ pod中的目录将被覆盖。 我正在拉最新的S
我有一个 MyObject 类型的对象 obj,我声明了它的实例。 MyObject obj; 但是,我没有初始化它。 MyObject 的类看起来像: public class MyObject {
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
这个问题已经有答案了: Android: Issue during Arraylist declaration (1 个回答) 已关闭 9 年前。 有时我会看到 ArrayList 声明如下 Arra
我对java比较陌生,经过大量搜索,我无法将相关问题的任何解决方案与我的解决方案配对。我正在尝试实现一种非常简单的方法来写入/读取数组,但编译器无法识别它。 “键盘”也是一个“无法识别的变量”。这是数
简短:何时分配内存 - 在声明或初始化时? 长整型:int x;将占用与int z = 10;相同的内存。 此外,这对于包含更多数据的自定义对象将如何工作。假设我有这个对象: public class
我需要使用此程序更好地理解函数定义、声明和正确调用。我真的需要了解如何使用它们。您能否向我展示编写此程序的正确方法(所有三个都正确并进行解释)? #include #include quad_eq
这是我的主要功能以及我要传递的内容。 int main(void){ struct can elC[7]; // Create an array of stucts Initiali
我想知道是否有更好的方法来完成此任务; 我有一个对象 - 其中一个属性是字典。我有一组逗号分隔值。我需要过滤 Dictionary 并仅获取 Dictionary 值至少与其中一个值匹配的那些元素 这
下面的using-declarations有什么意义 using eoPop::size; using eoPop::operator[]; using eoPop::back; using eoPo
我的问题更像是一个关于 for 循环样式的好奇问题。在阅读别人的一些旧代码时,我遇到了一种我以前从未见过的风格。 var declaredEarlier = Array for(var i=0, le
我是一名优秀的程序员,十分优秀!