在这部分代码中
if (min != i) {
int temp = arr[i].time;
arr[i].time = arr[min].time;
arr[min].time = temp;
}
您只是在更改应该移动整个对象的时间。要修复它,代码的行为必须如下所示:
if (min != i) {
//saving the object reference from arr[i] in a temp variable
showInfo temp = arr[i];
//swapping the elements
arr[i] = arr[min];
arr[min] = temp;
}
I̶t̶ ̶w̶o̶u̶l̶d̶ ̶b̶e̶ ̶b̶e̶t̶t̶e̶r̶ ̶t̶o̶ ̶u̶s̶e̶ ̶ Arrays#sort
̶w̶h̶e̶r̶e̶ ̶y̶o̶u̶ ̶p̶r̶o̶v̶i̶d̶e̶ ̶a̶ ̶c̶u̶s̶t̶o̶m̶ ̶ ̶C̶o̶m̶p̶a̶r̶a̶t̶o̶r̶
̶ ̶o̶f̶ ̶t̶h̶e̶ ̶c̶l̶a̶s̶s̶ ̶b̶e̶i̶n̶g̶ ̶s̶o̶r̶t̶e̶d̶ ̶(̶i̶f̶ ̶y̶o̶u̶ ̶a̶r̶e̶ ̶a̶l̶l̶o̶w̶e̶d̶ ̶t̶o̶ ̶u̶s̶e̶ ̶t̶h̶i̶s̶ ̶a̶p̶p̶r̶o̶a̶c̶h̶)̶.̶ ̶S̶h̶o̶r̶t̶ ̶e̶x̶a̶m̶p̶l̶e̶:̶
showInfo[] showInfoArray = ...
//your array declared and filled with data
//sorting the array
Arrays.sort(showInfoArray, new Comparator<showInfo>() {
@Override
public int compare(showInfo showInfo1, showInfo showInfo2) {
//write the comparison logic
//basic implementation
if (showInfo1.getTime() == showInfo2.getTime()) {
return showInfo1.getName().compareTo(showInfo2.getName());
}
return Integer.compare(showInfo1.getTime(), showInfo2.getTime());
}
});
//showInfoArray will be sorted...
由于您必须使用定制的排序算法并支持不同的数据排序方式,因此您只需更改比较数据的方式。这意味着,在您当前的代码中,更改这部分
if (arr[j].time < arr[min].time) {
min = j;
}
对于更通用的东西,比如
if (compare(arr[j], arr[min]) < 0) {
min = j;
}
您只需要compare
通过您需要的方法来更改方法的实现。尽管如此,创建和维护一个可以支持不同方式来比较数据的方法还是太复杂了。所以最好的选择似乎是 a Comparator<showInfo>
,让你的代码看起来像这样:
if (showInfoComparator.compare(arr[j], arr[min]) < 0) {
min = j;
}
其中showInfoComparator
保存了比较元素的逻辑。现在你intSort
会变成更通用的东西:
public static void genericSort(Comparator<showInfo> showInfoComparator) {
//your current implementation with few modifications
//...
//using the comparator to find the minimum element
if (showInfoComparator.compare(arr[j], arr[min]) < 0) {
min = j;
}
//...
//swapping the elements directly in the array instead of swapping part of the data
if (min != i) {
int temp = arr[i].time;
arr[i].time = arr[min].time;
arr[min].time = temp;
}
//...
}
现在,您只需编写一组Comparator<showInfo>
支持您的自定义标准的实现。例如,这是一个使用该字段比较showInfo
实例的例子:time
public class ShowInfoTimeComparator implements Comparator<showInfo> {
@Override
public int compare(showInfo showInfo1, showInfo showInfo2) {
//write the comparison logic
return Integer.compare(showInfo1.getTime(), showInfo2.getTime());
}
}
另一个使用该name
字段的比较器:
public class ShowInfoNameComparator implements Comparator<showInfo> {
@Override
public int compare(showInfo showInfo1, showInfo showInfo2) {
//write the comparison logic
return showInfo1.getName().compareTo(showInfo2.getName());
}
}
现在在您的代码中,您可以这样称呼它1:
if (*compare by time*) {
genericSort(showInfoArray, new ShowInfoTimeComparator());
}
if (*compare by name*) {
genericSort(showInfoArray, new ShowInfoNameComparator());
}
if (*another custom rule*) {
genericSort(showInfoArray, new ShowInfoAnotherCustomRuleComparator());
}
现在您可以在哪里实现自定义规则,例如showInfo
使用两个或多个字段比较对象。name
以您的和day
字段为例(如问题中所述):
public class ShowInfoNameAndDayComparator implements Comparator<showInfo> {
@Override
public int compare(showInfo showInfo1, showInfo showInfo2) {
//write the comparison logic
int nameComparisonResult = showInfo1.getName().compareTo(showInfo2.getName());
if (nameComparisonResult == 0) {
return showInfo1.getDay().compareTo(showInfo2.getDay());
}
return nameComparisonResult;
}
}
1:还有其他方法可以解决这个问题,而不是使用大量if
语句,但看起来这超出了问题范围。如果没有,请编辑问题并添加它以显示解决此问题的另一种方法。
当前代码的其他提示:
- 使用 CamelCase 声明类的名称,其中类名的第一个字母是大写,因此您的
showInfo
类必须重命名为ShowInfo
.
要访问类的字段,请使用适当的 getter 和 setter,而不是将字段标记为public
或离开 withdefault
范围。这意味着,你的ShowInfo
班级应该变成:
public class ShowInfo {
private String name;
private String day;
private int time;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
//similar for other fields in the class
}