2014-09-30 4 views
3

У меня есть домашнее задание, где меня просят:метод в методе (домашнее задание)

Напишите метод sort(int[] arr), который принимает целочисленный массив и использует метод из предыдущего упражнения, чтобы определить, является ли массив сортируется в увеличивая заказ или нет. Если он уже отсортирован, он должен вернуть массив , если это не так, метод должен сортировать массив перед возвратом .

Моя проблема в том, что я не знаю, как я должен подходить к этому заданию? Должен ли я изменить предыдущий метод, вызвать его в новом методе или создать метод в методе? Это предыдущий метод, который я написал:

public static void isSorted(int[] checkArray) { 
    boolean isSorted = true; 
    for (int i = 1; i < checkArray.length; i++) { 
     if (checkArray[i - 1] > checkArray[i]) { 
      isSorted = false; 

Thanx заранее

+8

Вы не можете объявлять методы в пределах методов.В вашем задании вам предлагается использовать метод из предыдущего упражнения, чтобы проверить, отсортирован ли массив в порядке возрастания или нет. Используй это. – proulxs

+0

'public void bar() {foo(); } 'Я вызываю метод' foo() 'из своего метода' bar() '. Та же концепция, что и ваше задание. – Compass

ответ

1

В интересах вас на самом деле узнать что-то, вот мое решение:

public int[] sort(int[] arr) { 
    if (!isSorted(arr)) 
     Arrays.sort(arr); 
    return arr; 
} 

Here документация для Arrays.sort

не только это более кратким, это также делает вид на месте. Это означает, что вместо копирования массива, который вы проходите, выполняете работу, а затем возвращаете копию, он просто выполняет работу с исходным массивом. Это делает его немного быстрее и означает, что он занимает минимальное пространство. Не такая большая сделка, когда ваш размер ввода равен 10, но это когда вы доберетесь до 10 миллионов. Также обратите внимание на формулировку задания: If it is already sorted, it should return the array, if it is not, the method should sort the array before returning it. Технически, возвращая копию оригинального массива - это не то, что требуется заданию. Он хочет оригинал.

Так что это короткий, чистый, быстрый и эффективный объем памяти. Это должно быть хорошо, не так ли?

Нет, потому что он имеет один огромный недостаток. Он нарушает подразумеваемый контракт метода. Функция, которая меняет свои аргументы, не должна возвращать ничего, а функция, возвращающая что-то, не должна изменять свои аргументы. Это основной принцип разработки программного обеспечения (и тот, который демонстрирует Arrays.sort). Нарушение этого может вызвать серьезные проблемы для тех, кто считает вас компетентными и не нарушит это правило.

Если мы будем следовать правилу, sort должно быть таким:

public void sort(int[] arr) { 
    if (!isSorted(arr)) 
     Arrays.sort(arr); 
} 

Так сказать, ваш учитель бронированный хомяк вы встретились на интернет сказал, чтобы остановить учу вас плохой дизайн интерфейса.

+0

Большое спасибо! Это похоже на лучший подход. Я обязательно скажу ему, что ха-ха. –

1

Я читаю «использует [настоящий] метод» означает «вызов метода». Тем не менее, тестирование сортировки перед сортировкой кажется несколько бессмысленным, поэтому стоит проверить двойную проверку с тем, кто дал вам это задание.

Одна проблема с вашим предыдущим методом заключается в том, что он ничего не возвращает. Вам нужно что-то сделать, чтобы сделать его полезным.

+1

Существуют определенные алгоритмы сортировки, которые очень плохо выполняются при сортировке данных, поэтому проверка работоспособности заранее является разумной. – Floegipoky

+0

Правда. В фактическом назначении я вызываю метод и печатаю результат. –

+0

@Floegipoky: Point принят. И, опять же, это всего лишь упражнение в конце концов. – NPE

1

Это то, что вы хотите сделать:

public int[] sort(int[] arr) 
{ 
    if (isSorted(arr)) 
     return arr; 
    else 
    { 
     \\Your sorting code here 

     return sorted_array; 
    } 
} 
Смежные вопросы