Java 可以检查对象字段的常规选择排序

Java 可以检查对象字段的常规选择排序,java,sorting,generics,arraylist,selection-sort,Java,Sorting,Generics,Arraylist,Selection Sort,我需要做的是获取一个包含名称字段的文件,然后将其包含数据,并根据表示特定数据集的给定数字对其进行排序。下面是一个示例文本文件。这就像城市一样,每个月的平均气温实际上并不准确 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

我需要做的是获取一个包含名称字段的文件,然后将其包含数据,并根据表示特定数据集的给定数字对其进行排序。下面是一个示例文本文件。这就像城市一样,每个月的平均气温实际上并不准确

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);

    }

}
对于实际的对象,我有这样一个例子,其中构造函数的输入仅仅是文本文件中的一整行。然后,数据句柄和名称句柄帮助将字符串拆分,并将name设置为文本文件中的名称,并将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);

}
}

主要来说,所有的对象都被放入一个arraylist,这将是对象的arraylist,然后输入SelectionSort类。我遇到的问题是,如何对这样的对象使用泛型选择排序。我正计划打电话给你,比如说,如果钥匙是2,就像上面所说的那样。我会打电话

ifarrayList.getsmallestIndex.getIndex2.compareToarrayList.getsmallestIndex.getIndex2>0

而不是ifarrayList.getsmallestIndex.compareToarrayList.getj>0


我唯一想做这件事的另一种方法是不创建对象,而是将所有信息放入一个2d数组中,然后进行比较,但随后我丢失了数据的名称。如果有人可以建议我如何改变它,使它工作,或者完全不同的方式来实现这一点,那就太好了。

< P>你可以考虑创建一个实现接口的对象,并将索引作为参数进行排序:

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;
    }
}

如果你有一个城市列表,为了举例,我们称之为cityList,你可以使用Collections.sortcityList,new DataComparator2对其进行排序。

好的,我想我明白了,除了我如何在Collections.sort方法中使用DataComparator?我不需要修改一个使用DataComparator的比较方法的新排序方法吗?这将再次使它无法使用泛型。集合。排序已经使用了传递给它的比较器。您只需创建一个使用所需索引进行排序的实例,然后将该实例传递给Collections.sort,就像最后的示例一样。顺便感谢您的帮助。只是想知道sort方法的第二个参数是否必须更改才能接受对象?还很困惑,因为我在sort方法中使用了compareTo,而您在实现Comparator时显示的是compareTo方法而不是compareTo。您所说的sort方法是指Collections.sort吗?如果是,则为否,第二个参数是比较器。请注意,使用这种方法,您不会使用自己的排序方法,因为Collections.sort本身就是一种排序算法。您应该看看和的Javadocs。