我需要做的是获取一个包含名称字段的文件,然后使用它们获取数据,并根据代表某组数据的给定数字对它们进行排序。这是一个示例文本文件。这就像城市及其每个月的平均温度(实际上并不准确)。
NewYork: 35, 28, 99, 39, 3, 15, 52, 5, 6, 97, 36, 32
Baltimore: 1, 59, 55, 0, 92, 82, 23, 60, 23, 16, 75, 75
Seattle: 19, 18, 10, 36, 50, 2, 8, 36, 56, 86, 14, 91
Atlanta: 57, 75, 52, 66, 28, 58, 53, 5, 21, 30, 81, 58
我希望能够根据给定的数据点对这些进行排序,因此如果选择2,则应按升序对第二个点进行排序,使其看起来像这样。每个城市的实际数据都没有排序,整个数据集根据正在使用的数据点向上或向下移动。
Seattle: 19, 18, 10, 36, 50, 2, 8, 36, 56, 86, 14, 91
NewYork: 35, 28, 99, 39, 3, 15, 52, 5, 6, 97, 36, 32
Baltimore: 1, 59, 55, 0, 92, 82, 23, 60, 23, 16, 75, 75
Atlanta: 57, 75, 52, 66, 28, 58, 53, 5, 21, 30, 81, 58
^
This is the second data point row that was sorted.
以下是selectionsort类的样子,我可以在没有泛型的情况下使用它,但我希望能够使用泛型。
public class SelectionSort{
private SelectionSort(){
}
public static <T extends Comparable<T>> void sort(ArrayList <T> arrayList, int key){
for(int i=0; i<arrayList.size() -1; i++)
{
int smallestIndex = i;
for(int j=i+1; j<arrayList.size(); j++)
{
if(arrayList.get(smallestIndex).compareTo((arrayList.get(j))) > 0 )
{
smallestIndex = j;
}
}
T temp = arrayList.get(i);
arrayList.add(i,arrayList.get(smallestIndex));
arrayList.add(smallestIndex, temp);
}
}
然后对于实际的对象我有这个,其中构造函数的输入只是文本文件中的一整行。然后,数据句柄和名称句柄有助于拆分String up并将名称设置为文本文件中的名称,并将arraylist设置为名称与其一起使用的所有数字。
public class ObjectData<T> {
private ArrayList<Integer> list;
private String name;
public ObjectData(String objectInfo){
String array[] = allData(objectInfo);
this.name = nameHandle(array[0]);
list = new ArrayList<Integer>(Arrays.asList(dataHandle(array[1])));
}
private static String[] allData(String string){
String array[] = string.split(":");
return array;
}
private static String nameHandle(String string){
String name = string.trim();
return name;
}
private Integer[] dataHandle(String string){
String array[] = string.split(",");
String trimmedArray[] = new String[array.length];
Integer integerArray[] = new Integer[trimmedArray.length];
for (int i = 0; i < array.length; i++){
trimmedArray[i] = array[i].trim();
}
for (int i = 0; i < trimmedArray.length; i++){
integerArray[i] = Integer.valueOf(trimmedArray[i]);
}
return integerArray;
}
public String getName(){
return this.name;
}
public Integer getIndex(int index){
return list.get(index);
}
}
在main中,所有对象都被放入arraylist中,这将是对象的arraylist,然后输入到SelectionSort类中。我遇到的问题是弄清楚如何使用像这样的对象的泛型选择排序。我打算如果密钥是2,就像上面那样只是调用一个例子。我会打电话给
if(arrayList.get(smallestIndex).getIndex(2).compareTo((arrayList.get(smallestIndex).getIndex(2))) > 0 )
而不是if(arrayList.get(smallestIndex).compareTo((arrayList.get(j))) > 0 )
我考虑能够做到这一点的唯一另一种方法是,不是创建对象,而是将所有信息放入二维数组,然后能够比较它们,但后来我丢失了数据的名称。如果有人可以建议我应该如何改变它以使其发挥作用,或者以完全不同的方式来实现这一目标,那就太棒了。
答案 0 :(得分:1)
您可以考虑的一种方法是创建一个实现Comparator
接口的对象,并将索引作为参数进行排序:
public class DataComparator implements Comparator<ObjectData>{
private int sortIndex;
public DataComparator(int sortIndex){
this.sortIndex = sortIndex;
}
public int compare(ObjectData t1, ObjectData t2) {
return (t1.getIndex(sortIndex) < t2.getDataIndex(sortIndex)) ? -1 : 1;
}
}
如果您有List<ObjectData>
个城市,我们可以将其称为cityList
,例如,您可以使用Collections.sort(cityList, new DataComparator(2))
对其进行排序。