如何根据Class数据成员的值对HashMap进行排序



我有作为的哈希图

Map<Integer, CustomClass> 

CustomClass定义为


Class CustomClass {
String s,
Integer i
... constructors & getter setters
}

我将对象初始化为

Map<Integer, CustomClass> map = new HashMap<>() 

用值填充。

我想根据CustomClass的String的数据成员进行排序。

我尝试过编写lambda表达式,但无法获得正确的排序顺序映射。

我试着嘲笑下面的代码

import java.util.*;

class FileMap implements Comparable<FileMap>{
private String fileName;
private int file;
public FileMap(String fileName, int file){
this.fileName = fileName;
this.file = file;
}

public String getFileName() {
return fileName;
}

public void setFileName(String fileName) {
this.fileName = fileName;
}

public int getFile() {
return file;
}

public void setFile(int file) {
this.file = file;
}
@Override
public int compareTo(FileMap that){
return this.fileName.compareTo(that.getFileName());
}
@Override
public String toString(){
return this.fileName;
}
}
class Main {
public static void main(String[] args) {
FileMap fm1 = new FileMap("abc.txt", 0);
FileMap fm2 = new FileMap("abd.txt", 0);
FileMap fm3 = new FileMap("abe.txt", 0);
FileMap fm4 = new FileMap("abf.txt", 0);
Map<Integer, FileMap> fileMap = new HashMap<>();
fileMap.put(0, fm1);
fileMap.put(1, fm3);
fileMap.put(2, fm2);
fileMap.put(3, fm4);
System.out.println(fileMap); 

Map<Integer, FileMap> tree = new TreeMap<>();
tree.putAll(fileMap);
System.out.println(tree);
}
}

TreeMap根据其维护条目的顺序,而不是根据其。因此,您不能指示它以您需要的方式存储条目。

作为一种变通方法,您可以使用LinkedHashMap来维护添加到映射中的条目的顺序。

注意如果之后更新地图,顺序可能会中断

这就是使用Stream API和收集器到toMap()实现它的方法

Map<Integer, FileMap> fileMap = Map.of(
0, new FileMap("abc.txt", 0),
1, new FileMap("abd.txt", 0),
2, new FileMap("abe.txt", 0),
3, new FileMap("abf.txt", 0)
);

Map<Integer, FileMap> result = fileMap.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(left, right) -> { 
throw new AssertionError("All Keys in the source are expected to be unique");
},
LinkedHashMap::new
));

使用简单的老式命令式编程也可以实现同样的功能:

Map<Integer, FileMap> fileMap = Map.of(
0, new FileMap("abc.txt", 0),
1, new FileMap("abd.txt", 0),
2, new FileMap("abe.txt", 0),
3, new FileMap("abf.txt", 0)
);

List<Map.Entry<Integer, FileMap>> sortedEntries = new ArrayList<>(fileMap.entrySet());
sortedEntries.sort(Map.Entry.comparingByValue());

Map<Integer, FileMap> result = new LinkedHashMap<>();

for (Map.Entry<Integer, FileMap> entry : sortedEntries) {
result.put(entry.getKey(), entry.getValue());
}

相关内容

  • 没有找到相关文章