所以我正在研究我的程序,它使用排序技术对随机数进行排序,例如快速排序和气泡排序。 我写了代码,我意识到我的代码正在重复,但我不知道如何缩短它们,因为它们非常相似,但有些标志不同...... 例如,
if (radioButAscending.isSelected()){ //ascending order
for(int i=0;i<numbers.size()-1;i++){
int minNum=i;
for (int j=i+1;j<numbers.size();j++){
if(numbers.get(j)<numbers.get(minNum)){
tempNum=numbers.get(i);
numbers.set(i,numbers.get(j) ); //change numbers[i] to numbers[j] (numbers.get(i) = numbers.get(j))
numbers.set(j,tempNum); //numbers.get(j)=tempNum
}
}
}
showSortedNumbers();
} else { //descending order
for(int i=0;i<numbers.size()-1;i++){
int minNum=i;
for (int j=i+1;j<numbers.size();j++){
if(numbers.get(j)>numbers.get(minNum)){
tempNum=numbers.get(i);
numbers.set(i,numbers.get(j) ); //change numbers[i] to numbers[j] (numbers.get(i) = numbers.get(j))
numbers.set(j,tempNum); //numbers.get(j)=tempNum
}
}
}
showSortedNumbers();
}
这些是我的代码,正如您所看到的,除了这些代码之外,代码非常相似;
if(numbers.get(j)<numbers.get(minNum)){
if(numbers.get(j)>numbers.get(minNum)){
所以我的问题是......我该如何缩短它?我试图制作一个子程序,但标志是不同的所以我无法做到..请帮助伙计们非常感谢! :)
答案 0 :(得分:0)
if ( ascending )
Collections.sort( numbers );
else
Collections.sort( numbers, Collections.reverseOrder() );
答案 1 :(得分:0)
假设Java 8:
Collections.sort(numbers,
radioButAscending.isSelected() ?
Comparator.naturalOrder() : Comparator.reverseOrder());
showSortedNumbers();
答案 2 :(得分:0)
我会考虑您要使用自定义方法,并且只进行重复数据删除。如果您想使用Collections
,则会将代码缩减为四行。
首先,这两个代码块之间的唯一区别是最里面的if
语句;一个比较<
,另一个比较>
。他们所做的一切都是一样的。
此特定代码隔离了条件行为并减少了整个循环语句的重复。
boolean ascendingOrder = radioButAscending.isSelected();
for (int i = 0; i < numbers.size() - 1; i++) {
int minNum = i;
for (int j = i + 1; j < numbers.size(); j++) {
if (ascendingOrder) {
if (numbers.get(j) < numbers.get(minNum)) {
tempNum = numbers.get(i);
numbers.set(i, numbers.get(j)); //change numbers[i] to numbers[j] (numbers.get(i) = numbers.get(j))
numbers.set(j, tempNum); //numbers.get(j)=tempNum
}
} else {
if (numbers.get(j) > numbers.get(minNum)) {
tempNum = numbers.get(i);
numbers.set(i, numbers.get(j)); //change numbers[i] to numbers[j] (numbers.get(i) = numbers.get(j))
numbers.set(j, tempNum); //numbers.get(j)=tempNum
}
}
}
}
showSortedNumbers();
我们可以做得更好吗?的绝对!强>
我们定义一个新方法compare
,它从集合中获取两个参数,并为我们进行比较操作。它基本上承担了此方法中布尔逻辑的责任。
private <T extends Comparable<T>> boolean compare(T left, T right, boolean isAscending) {
return isAscending ?
left.compareTo(right) <= 0 :
right.compareTo(left) <= 0;
}
如果我们正在提升,那么我们将左值与右值进行比较,看它是否更少(4和17; 4小于17)。如果我们下降,我们比较相反的方式(4和17; 17大于4)。
这会将代码块减少到:
boolean ascendingOrder = radioButAscending.isSelected();
for (int i = 0; i < numbers.size() - 1; i++) {
int minNum = i;
for (int j = i + 1; j < numbers.size(); j++) {
if (compare(numbers.get(j), numbers.get(minNum), ascendingOrder)) {
tempNum = numbers.get(i);
numbers.set(i, numbers.get(j)); //change numbers[i] to numbers[j] (numbers.get(i) = numbers.get(j))
numbers.set(j, tempNum); //numbers.get(j)=tempNum
}
}
}
showSortedNumbers();