Java如何缩短这段代码?

时间:2015-03-01 03:41:13

标签: java

所以我正在研究我的程序,它使用排序技术对随机数进行排序,例如快速排序和气泡排序。 我写了代码,我意识到我的代码正在重复,但我不知道如何缩短它们,因为它们非常相似,但有些标志不同...... 例如,

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

所以我的问题是......我该如何缩短它?我试图制作一个子程序,但标志是不同的所以我无法做到..请帮助伙计们非常感谢! :)

3 个答案:

答案 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();