我想在Java中创建一个类似于结构的表,如图所示
表结构 虽然我不是Java专家,但我尝试使用Arraylist结构实现它,如下所示:
List<List<Double>> dataList = new ArrayList<List<Double>>();
for(int x = 0; x < n; x++){
List<Double> tempList = new ArrayList<Double>();
dataList.add(tempList);
}
for(int y = 0; y < n; y++){
double execution = exectime[y];
double cost= cost[y];
dataList.get(y).add(execution);
dataList.get(y).add(cost);
}
for (int z=0;z<dataList.size();z++) {
Double v1=dataList.get(z).get(0);
Double v2=dataList.get(z).get(1);
System.out.println("ID"+z +" Execution time:" + v1 + "cost: " + v2);
}
其中'n','exectime [n]'和'cost [n]'的值将从文件中读取,'n'是需要创建的'ids'的总数。
创建表后,我想根据“执行时间”值和“成本”值对其进行排序,包括递增和递减顺序。在这方面请帮助我。
答案 0 :(得分:1)
@ snovelli关于使用类封装数据的答案是一个很好的观点。
如果您使用的是Java 8,则可以轻松创建和链接使用访问器的比较器。
对于对象列表的排序,它可能类似于:
List<ExecutionTimeData> dataList = new ArrayList<>();
dataList.sort(Comparator
.comparing(ExecutionTimeData::getExecutionTime)
.thenComparing(ExecutionTimeData::getCost));
按执行时间排序,然后是费用。
如果您真的想要,也可以使用它来对List<List<Double>>
进行排序。
List<List<Double>> doubleListList = new ArrayList<>();
doubleListList.sort(Comparator
.comparing((List<Double> l) -> l.get(0))
.thenComparing(l -> l.get(1)));
按列表的元素0排序,后跟元素1。
或者按相反顺序排序:
List<ExecutionTimeData> dataList = new ArrayList<>();
dataList.sort(Comparator
.comparing(ExecutionTimeData::getExecutionTime).reversed()
.thenComparing(ExecutionTimeData::getCost).reversed());
答案 1 :(得分:0)
然后,您将按照自己的方式对收藏清单进行排序。
答案 2 :(得分:0)
我想你想要一个SortedSet类,你可以定义为:
public class ExecutionTimeData{
private final long id;
private final long executionTime;
private final int cost;
public ExecutionTimeData(long id, long executionTime, int cost){
this.id = id;
this.executionTime = executionTime;
this.cost = cost;
}
/* Getters */
}
然后您将只有一个未排序的列表,如
List<ExecutionTimeData> unsortedList = new ArrayList<>();
正如@VikrantKashyap指出的那样,为了列出价值和成本,你必须实现Chained Comparator
public class ExecutionTimeDataChainedComparator implements Comparator<ExecutionTimeData> {
private List<Comparator<ExecutionTimeData>> listComparators;
@SafeVarargs
public ExecutionTimeDataChainedComparator (Comparator<ExecutionTimeData>... comparators) {
this.listComparators = Arrays.asList(comparators);
}
@Override
public int compare(ExecutionTimeData etd1, ExecutionTimeData etd2) {
for (Comparator<ExecutionTimeData> comparator : listComparators) {
int result = comparator.compare(etd1, etd2);
if (result != 0) {
return result;
}
}
return 0;
}
}
并实现这样的比较器
public class ExecutionTimeDataCostComparator implements Comparator<ExecutionTimeData > {
@Override
public int compare(ExecutionTimeData a, ExecutionTimeData b) {
return b.getCost() > a.getCost()?-1:1;
}
}
public class ExecutionTimeDataExecutionComparator implements Comparator<ExecutionTimeData > {
@Override
public int compare(ExecutionTimeData a, ExecutionTimeData b) {
return b.getExecutionTime() > a.getExecutionTime()?-1:1;
}
}
当然,通过实例化提供ASCENDING
或DESCENDING
订单
答案 3 :(得分:0)
使用Collections.sort() with Comparator。
但是,您将丢失ID
信息,因为它基于您的ArrayList索引。因此,如果您使用此方法并希望保留ID信息,则需要add()
ID到您的ArrayList,就像execution
和cost
一样。
Comparator<List<Double>> ORDER = new Comparator<List<Double>>() {
@Override
public int compare(List<Double> lhs, List<Double> rhs) {
if (lhs.get(1) < rhs.get(1)) return -1;
if (lhs.get(1) == rhs.get(1)) return 0;
return 1;
}
};
Collections.sort(dataList, ORDER);
在上面的代码中,您的dataList将使用cost
进行排序,因为它位于ArrayList的索引1处。
但是,更好的方法(可读性)是将列放入Class,而不仅仅是ArrayList。例如,您可以像这样创建一个类:
class Information {
private int id;
private double execution;
private double cost;
Information(int id, double execution, double cost) {
this.id = id;
this.execution = execution;
this.cost = cost;
}
}
在该类中实现静态Comparator。它将提高代码的可读性。
答案 4 :(得分:0)
我认为你应该使用链式Comparator
来使用多个属性来实现sorting
。因为如果单独使用单个Comparator
它会根据自己的Compare()
方法实现对数据进行排序。
最好使用链式
Comparator
对多个属性的数据进行排序...尝试以下链接==&gt; Sorting a list by multiple attributes example