Оптимизация сортировки слиянием с ArrayList - PullRequest
0 голосов
/ 25 апреля 2018

Я написал эту версию Merge Sort (это часть, где я объединяю части), но у нее есть проблема. Я хотел бы использовать его с обобщениями, поэтому я создал массив Object, чтобы помочь мне во время процесса. Когда я компилирую, он выдает предупреждение, которое я подавил этой строкой в ​​верхней части кода. Есть ли способ избежать использования массива Object? (Метод сравнения из другого класса, но он работает так же, как и CompareTo):

@SuppressWarnings("unchecked")
  public static <T> void merge(ArrayList<T> array, Comparator<T> c, int p, int mid, int q) {
    Object[] tmp = new Object[q-p+1]; 
    int i = p;
    int j = mid+1;
    int k = 0;
    while (i <= mid && j <= q) {
        if (c.compare(array.get(i), array.get(j))<0)
          tmp[k] = array.get(i++);
        else
          tmp[k] = array.get(j++);
        k++;
    }
    if (i <= mid && j > q) {
        while (i <= mid) 
          tmp[k++] = array.get(i++);
    } else {
        while (j <= q)
          tmp[k++] = array.get(j++);
    }
    for (k = 0; k < tmp.length; k++)
      array.set(k+p, (T)tmp[k]);
  }

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Ваш код в порядке.Вы также могли бы использовать:

T[] tmp = (T[]) new Object[q - p + 1];

с такой же аннотацией подавления и пропустить приведение при (T) tmp [k].

0 голосов
/ 25 апреля 2018
public static <T> void merge(ArrayList<T> array, Comparator<T> c, int p, int mid, int q) {
        ArrayList<T> tmp = new ArrayList<T>(q-p+1); 
        int i = p;
        int j = mid+1;
        int k = 0;
        while (i <= mid && j <= q) {
            if (c.compare(array.get(i), array.get(j))<0)

                tmp.add(array.get(i++));
            else
                tmp.add(array.get(j++));
            k++;
        }
        if (i <= mid && j > q) {
            while (i <= mid) 
                tmp.add(array.get(i++));
        } else {
            while (j <= q)
                tmp.add(array.get(j++));
        }
        for (k = 0; k < tmp.size(); k++)
          array.set(k, tmp.get(k));

        System.out.println(array);
      }

Таким способом можно пропустить массив объектов.Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...