java - 为什么Java中的TreeSet表现如下?
问题描述
ArrayList<String> a1=new ArrayList<String>();
a1.add("Item1");
a1.add("58584272");
a1.add("62930912");
ArrayList<String> a2=new ArrayList<String>();
a2.add("Item2");
a2.add("9425650");
a2.add("96088250");
ArrayList<String> a3=new ArrayList<String>();
a3.add("Item3");
a3.add("37469674");
a3.add("46363902");
ArrayList<String> a4=new ArrayList<String>();
a4.add("Item4");
a4.add("18666489");
a4.add("88046739");
List<List<String>> a5=new ArrayList<List<String>>();
a5.add(a1);
a5.add(a2);
a5.add(a3);
a5.add(a4);
TreeSet<List<String>> ts=new TreeSet<List<String>>(new mycomparator());
for(int i=0; i<=a.size()-1; i++){
ts.add(a5.get(i));
}
System.out.Println(ts); // Returns [[Item1, 58584272, 62930912]]
public class mycomparator implements Comparator{
static int order,paramenter=0;
@Override
public int compare(Object o1, Object o2) {
List<String> a1=(List<String>)o1;
List<String> a2=(List<String>)o1;
int b1=Integer.parseInt(a1.get(paramenter));
int b2=Integer.parseInt(a2.get(paramenter));
if(b1>b2){ return order==1?1:-1;}
else if (b1<b2){return order==1?-1:1;}
else{return 0;}
}
}
在上面的代码中,我试图将对象添加到树集中,当我尝试打印树集时添加了所有元素后,只添加了第一个元素。为什么会这样?
结果 --> [[Item1, 58584272, 62930912]]
解决方案
你的代码有很多问题:
- 使用原始
Comparator
版本而不是参数化版本。 for
在循环中使用错误的变量。static
在比较器中使用变量。
附带说明一下,您应该遵循Java 命名约定,例如该类mycomparator
应命名为MyComparator
.
下面给出了包含这些注释的代码:
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;
class MyComparator implements Comparator<List<String>> {
int order, paramenter;
MyComparator(int order, int paramenter) {
this.order = order;
this.paramenter = paramenter;
}
@Override
public int compare(List<String> o1, List<String> o2) {
int b1 = Integer.parseInt(o1.get(paramenter));
int b2 = Integer.parseInt(o2.get(paramenter));
if (b1 > b2) {
return order == 1 ? 1 : -1;
} else if (b1 < b2) {
return order == 1 ? -1 : 1;
} else {
return 0;
}
}
}
public class Main {
public static void main(String[] args) {
ArrayList<String> a1 = new ArrayList<String>();
a1.add("Item1");
a1.add("58584272");
a1.add("62930912");
ArrayList<String> a2 = new ArrayList<String>();
a2.add("Item2");
a2.add("9425650");
a2.add("96088250");
ArrayList<String> a3 = new ArrayList<String>();
a3.add("Item3");
a3.add("37469674");
a3.add("46363902");
ArrayList<String> a4 = new ArrayList<String>();
a4.add("Item4");
a4.add("18666489");
a4.add("88046739");
List<ArrayList<String>> a5 = new ArrayList<ArrayList<String>>();
a5.add(a1);
a5.add(a2);
a5.add(a3);
a5.add(a4);
TreeSet<List<String>> ts = new TreeSet<List<String>>(new MyComparator(0, 1));
for (int i = 0; i < a5.size(); i++) {
ts.add(a5.get(i));
}
System.out.println(ts);
}
}
输出:
[[Item1, 58584272, 62930912], [Item3, 37469674, 46363902], [Item4, 18666489, 88046739], [Item2, 9425650, 96088250]]
注意:我刚刚在您的compare
方法中实现了您的逻辑。如果你能告诉我确切的要求,我会更新里面的代码,compare
或者你可以自己更新。
推荐阅读
- connection - 以编程方式更新 Airflow 中的连接时出现问题
- java - 当我在 arrayList 中使用 .get() 方法打印对象时,如何防止打印哈希码?
- php - 在 laravel 中使用 GuzzleHttp 发送原始空 json
- express - 子文档 mongoose 返回 [object]
- firebase - 同时运行两个功能项目
- java - 3d 迷宫的数组索引超出范围
- mysql - 如何对 MySQL 中的行进行唯一编号?
- python-3.x - 它不会在 csv 文件中保存任何内容?
- visual-studio-code - 如何重置 VS Code 中的默认浏览器设置?
- python - 使用请求库使用 python 从 ZOHO CREATOR API 获取数据