可以检查对象字段的通用选择排序

时间:2017-12-05 21:01:40

标签: 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
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 )

我考虑能够做到这一点的唯一另一种方法是,不是创建对象,而是将所有信息放入二维数组,然后能够比较它们,但后来我丢失了数据的名称。如果有人可以建议我应该如何改变它以使其发挥作用,或者以完全不同的方式来实现这一目标,那就太棒了。

1 个答案:

答案 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))对其进行排序。