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。