我写了这个版本的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]);
}
答案 0 :(得分:0)
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);
}
您可以通过这种方式跳过对象数组。希望它有所帮助:)
答案 1 :(得分:0)
你的代码很好。 您也可以使用:
T[] tmp = (T[]) new Object[q - p + 1];
具有相同的抑制注释,并跳过(T)tmp [k]的转换。