如果标题不清楚,让我举个例子:
我有一个按第一列排序的数组 - date
,我需要按照name
列中值的出现顺序再次对其进行排序
data[100][4]
date | name | text | type
-----+------+------+------
2222 | z | wwww | 2
2221 | z | qqqq | 1
2220 | c | dasa | 2
2219 | b | dsad | 1
2218 | z | dfsa | 2
2217 | c | dasd | 1
以下是排序后的数组:
order[100][4]
date | name | text | type
-----+------+------+------
2222 | z | wwww | 2
2221 | z | qqqq | 1
2218 | z | dfsa | 2
2220 | c | dasa | 2
2217 | c | dasd | 1
2219 | b | dsad | 1
我想将这些数据合并到一个字符串中,并在列之间插入一些符号以便将来检索它,添加到ArrayList
然后按名称检索。我已将data[i][1]
添加到HashMap
以确定唯一值的数量,因此我可以知道循环周期的数量。而名称值的顺序让我感到困惑,因为HashMap
没有维持秩序。
有没有人知道如何在没有那么麻烦的情况下进行分类?
答案 0 :(得分:2)
让对象表示具有日期,名称,文本和类型的数据条目,并让它实现Comparable
接口。 Comparable
接口有效地允许对对象执行不等式操作,并且是Java API用于进行任何对象比较(用于排序)的内容。然后,要根据给定字段对数据进行排序,请在数据对象类中包含一个静态变量,该变量表示要排序的字段。
class Data implements Comparable<Data>
{
int date; // field 1
String name; // field 2
String text; // field 3
int type; // field 4
static int sortField;
static final int DATE = 1;
static final int NAME = 2;
static final int TEXT = 3;
static final int TYPE = 4;
// put constructor here
//compareTo function for sorting
public int compareTo(Data other)
{
if (sortField == DATE)
{
if (date < other.date) return -1;
if (date > other.date) return 1;
else return 0;
}
if (sortField == NAME)
{
return name.compareTo(other.name);
}
if (sortField == TEXT)
{
return text.compareTo(other.text);
}
else
{
if (type < other.type) return -1;
if (type > other.type) return 1;
else return 0;
}
}
}
然后你要做的就是将对象放入ArrayList
并对它们进行排序
ArrayList<Data> list = new ArrayList<Data>();
//put Data objects into list here
//to sort
Data.sortField = Data.DATE; //sort by date - change as needed
Collections.sort(list);
答案 1 :(得分:2)
我使用@Aderis创建类的想法,但排序方法略有不同。初始化数组的代码已在此处发布,但有人将其删除。无论如何,我也用过它。
String[][] myArr = { { "2222", "b", "dfsa", "2" },
{ "2221", "z", "wwww", "2" }, { "2220", "c", "qqqq", "1" },
{ "2219", "z", "dasa", "2" }, { "2218", "b", "dsad", "1" } };
HashMap<String,String> hashData = new HashMap<>();
for (int i = 0; i < myArr.length; i++) hashData.put(myArr[i][1],myArr[i][1]);
int unique_entries = hashData.size();
ArrayList<Data> list = new ArrayList<Data>();
ArrayList<Data> list_sorted = new ArrayList<Data>();
for (int i = 0; i < myArr.length; i++){
Data temp = new Data(myArr[i][0],myArr[i][1],myArr[i][2],Integer.parseInt(myArr[i][3]));
list.add(temp);
}
for (int k = 0; k < unique_entries; k++){
boolean flag = true;
ArrayList<Integer> elements = new ArrayList<>();
int list_elements = list.size();
for (int i = 0; i < list_elements; i++){
if (flag){
list_sorted.add(list.get(i));
elements.add(i);
flag = false;
continue;
}
int list_sorted_elements = list_sorted.size();
for (int j = 0; j < list_sorted_elements; j++){
if (list_sorted.get(j).name.contains(list.get(i).name)){
list_sorted.add(list.get(i));
elements.add(i);
break;
}
}
}
for (int i = 0; i < elements.size(); i++){
int temp = elements.get(i);
if (i != 0) temp = temp - i;
list.remove(temp);
}
}
如您所见,为了确定唯一元素的数量,我将它们添加到HashMap
并检查其大小。我用我的数据对象填充ArrayList
并将排序数据添加到另一个ArrayList
,然后从未排序的List中删除这些数据并开始对其余数据进行排序。循环次数与唯一名称一样多。
我不相信这是一种最佳方式。但这是我所知道的唯一方式。如果有人知道更快的方式我会接受他们的帖子。
答案 2 :(得分:0)
将此2d数组转换为HashMap。对象部分将保存该特定的数组元素。
获取keyset ..将keyset转换为list ..对此列表进行排序..遍历列表并从map中获取各自的数组元素。
例如代码:
String[][] myArr = new String[4][3];
for (int i=0; i<myArr.length; i++) {
myArr[i][0] = (i+1)+"1";
myArr[i][1] = (i+1)+"2";
myArr[i][2] = (i+1)+"3";
}
Map<String, Object> map = new HashMap<String, Object>();
for (int i=myArr.length-1; i>=0; i--) {
map.put(myArr[i][0], myArr[i]);
}
List<String> keyList = new ArrayList<String>(map.keySet());
Collections.sort(keyList);
String[][] myNewArray = new String[4][3];
int a =0;
for (String s : keyList) {
myNewArray[a++] = ((String[])map.get(s));
}
我正在使用String,在你的情况下是日期。即使它是其他东西,您也可以使用可比较或压缩器来对该键列表进行排序。
使用排序键作为地图中的键。