我正在做一个简单的Dataframe,可以读写csv,并包括排序功能,按列排序。如何通过输入列标题对正确的列进行排序,并从排序中排除列标题行?
这是csv文件的示例数据:
Name,Age,Salary
Lim,20,2000
Tan,20,3000
Mah,19,2500
Roger,10,4000
我已经声明了我的2d列表,数据如下所示:
List<List<String>> COLUMNDATA = new ArrayList();
COLUMNDATA = [[Name, Age, Salary], [Lim, 20, 2000], [Tan, 20, 3000], [Mah, 19, 2500], [Roger, 10, 4000]]
我想通过传入列标题对正确的列进行排序,而列标题行不包括在排序中。如:
COLUMNDATA.sort(“Age”)
所以它会变成这样:
Name,Age,Salary
Roger,10,4000
Mah,19,2500
Lim,20,2000
Tan,20,3000
我用过 Comparator
以及 Collections.sort
,我现在被困住了。如何实现我想要的功能?
final Comparator<List<String>> comparator = new Comparator<List<String>>() {
@Override
public int compare(List<String> object1, List<String> object2) {
return object1.get(1).compareTo(object2.get(1));
}
};
Collections.sort(COLUMNDATA, comparator);
for (List<String> list : COLUMNDATA) {
System.out.println(list);
}
5条答案
按热度按时间cnjp1d6j1#
我提出不使用
List
,我认为那是有用的class
相对的名字更清楚。在本课程中,您可以定义所需的比较器。lzfw57am2#
你可以加入这个名单
sorted
从第二排开始,然后collect
新列表如下:排序数据1排序数据2
在这种情况下,使用2d数组而不是2d列表更有用,这样您就可以使用
Arrays.sort(T[],int,int,Comparator)
方法:原始列表排序数组
62o28rlo3#
你做的一切都是对的(除了变量名不应该全是大写的)。
在排序之前,只需删除第一个元素。然后排序,并将标题添加回列表:
如何将列号传递给比较器:
vshtjzan4#
你可以用
List.subList(int,int)
方法获取此列表中在指定索引之间由此列表支持的部分,然后使用Collections.sort(List,Comparator)
方法。此代码应适用于Java 7
:排序前排序后
另请参见:
•基于值排序列表<map<string,object>>
•在java中,如何将矩阵逆时针旋转90度?
ugmeyewa5#
下面是如何按你的要求做。一旦定义了比较器,只需在
sublist
从列表1开始,跳过标题。因为它是原始列表的视图,所以它仍然对所需的项进行排序。首先做一个字段Map,在哪个字段上排序。如果你想的话,可以不区分大小写。在这个例子中,案例很重要。
创建列表列表。
现在调用排序和打印
印刷品
这是排序方法。
下面是我建议您如何组织数据并进行排序。
首先创建一个类,如图所示。然后使用数据用类的示例填充列表。然后简单地指定要排序的getter。您可以根据需要添加任意多的附加字段及其getter。
原因是它允许混合类型存储在同一个对象中,并且仍然可以进行排序。如果你在一个
String number
它会分类的lexcally
而不是numerically
. 这将是一个问题,除非您转换为整数(要看到这一点,请更改4000
至400
按上述工资排序)。但是如果您想按名称排序,则需要一个不同的比较器,因为将非int转换为int会引发异常。这一切都可以在某种程度上得到缓解,但这并不像创建一个类那样简单。只需将方法引用更改为所需的
getter
你可以把这些东西分类List
在任何领域。如果没有getter,并且字段是public(不推荐),那么可以使用lambda。印刷品