用比较器进行Java数组排序
完整的代码可在以下位置找到: 这是代码的一部分:用比较器进行Java数组排序,java,arrays,sorting,nullpointerexception,comparator,Java,Arrays,Sorting,Nullpointerexception,Comparator,完整的代码可在以下位置找到: 这是代码的一部分: g_sorted = 0; for (int l_loop = 0; l_loop < l_length; l_loop++) { if (!l_IntegerArray[l_loop].equals(g_exclude)) { g_tag[g_sorted] = l_loop; g_tosort_Integer[g_sorted] = l_IntegerArray[l_loop];
g_sorted = 0;
for (int l_loop = 0; l_loop < l_length; l_loop++)
{
if (!l_IntegerArray[l_loop].equals(g_exclude))
{
g_tag[g_sorted] = l_loop;
g_tosort_Integer[g_sorted] = l_IntegerArray[l_loop];
g_sorted++;
}
} // for (int l_loop = 0; l_loop < p_toSort; l_loop++)
Arrays.sort
(g_tag, 0, g_sorted, new Comparator<Integer>()
{
public int compare(Integer i1, Integer i2)
{
return Integer.compare(g_tosort_Integer[i1], g_tosort_Integer[i2]);
}
}
);
g_排序=0;
for(int l_loop=0;l_loop
g_tosort_Integer、g_标记、g_tosort_Integer都是“整数”。
g_exclude用于排除不属于排序的项目
如果没有排除任何项(没有项的值等于g_exclude或if语句被注释),则一切正常
当排除1个或多个项目时,我得到一个NullPointerException:
Exception in thread "main" java.lang.NullPointerException
at TestSort$1.compare(TestSort.java:53)
at TestSort$1.compare(TestSort.java:50)
at java.util.TimSort.binarySort(TimSort.java:265)
at java.util.TimSort.sort(TimSort.java:190)
at java.util.Arrays.sort(Arrays.java:727)
at TestSort.<init>(TestSort.java:48)
at TestSort.main(TestSort.java:71)
线程“main”java.lang.NullPointerException中的异常
TestSort$1.compare(TestSort.java:53)
TestSort$1.compare(TestSort.java:50)
在java.util.TimSort.binarySort(TimSort.java:265)
位于java.util.TimSort.sort(TimSort.java:190)
位于java.util.Arrays.sort(Arrays.java:727)
TestSort.(TestSort.java:48)
位于TestSort.main(TestSort.java:71)
有人能给我解释一下吗?谢谢。这是如何解决的。我保留了您的类“结构”,但为了更清楚地了解我在做什么,我随意更改了变量名。您询问了如何对数组进行排序,而不是更改元素的顺序,而是更改数组上的索引 这是密码
public class TestSort {
int c_maxSort = 10000;
Integer[] unsortedAndFiltered = new Integer[c_maxSort];
Integer[] index = new Integer[c_maxSort];
public TestSort() {
Integer exclude = 0;
int newPosition;
int lengthOfOriginalArray;
Integer[] originalArray = { 5, 3, 0, 2, 7, 1, 5, 6, 8, 4 };
lengthOfOriginalArray = originalArray.length;
System.out.print("Original: ");
for (int i = 0; i < lengthOfOriginalArray; i++)
System.out.print(originalArray[i] + " ");
System.out.println(" - Length: " + lengthOfOriginalArray);
newPosition = 0;
for (int i = 0; i < lengthOfOriginalArray; i++) {
if (!originalArray[i].equals(exclude)) {
index[newPosition] = newPosition;
unsortedAndFiltered[newPosition] = originalArray[i];
newPosition++;
}
}
System.out.println("Tags: ");
for (int i = 0; i < newPosition; i++)
System.out.print(index[i] + " ");
System.out.println("");
System.out.println("Unsorted numbers: ");
for (int l_loop = 0; l_loop < newPosition; l_loop++)
System.out.print(unsortedAndFiltered[l_loop] + " ");
System.out.println("");
int deleted = lengthOfOriginalArray - newPosition;
Arrays.sort(index, 0, newPosition, new IndirectedComparator(unsortedAndFiltered, index));
System.out.println("Sorted Tags: ");
for (int i = 0; i < newPosition; i++)
System.out.print(index[i] + " ");
System.out.println("");
System.out.println("Sorted Numbers: ");
for (int i = 0; i < newPosition; i++)
System.out.print(unsortedAndFiltered[index[i]] + " ");
System.out.println("");
}
public static void main(String[] args) {
new TestSort();
}
}
您所有的变量名都是非常规且难以阅读的。请在此处发布任何相关代码,不要在链接中发布。i1、i2、g_tosort_Integer、g_tosort_Integer[i1]或g_tosort_Integer[i2]可能为空。使用调试器或日志语句找出哪一个,并修复错误。^正是@JBNizet所说的。@Sotirios Delimanolis:变量名是简单易懂的英文名称。我不知道你说的非传统是什么意思。我不认为这是问题所在。对于原始数组l_整数数组,l_长度为10,l_循环范围为0..9。g_标记和g_tosort_整数使用g_排序,它将是9(从0到8),请尝试并让我知道它是否解决了。如果将9作为索引传递(因为它是您的计数),那么当我将8作为索引传递给索引时,您必须传递8(您的数组现在是0-8索引的)。我没有得到NullPointerException,但数组排序不正确。当数组包含0..n的元素时,toIndex应为n+1(独占)。弦乐也是如此,Arrays.copyOfRange…我正在努力解决的问题是:当g_exclude=0时-源数组5 3 2 7 1 5 6 8 4-不排除-g_sorted=9-g_标记和g_tosort_整数元素来自0..8-效果完美-源数组5 3 0 2 7 1 5 6 8 4-1排除-g_sorted=9-g_标记和g_tosort_整数元素来自0..8-NullPointerExceptiong_排序的g_标记和g_tosort_整数的内容完全相同。第一个很好用,第二个结果是NullPointerException,我已经试过了。其他参数、调试语句(System.out.println)。。。但问题仍然没有解决。我对数组g_标记进行排序,使用一个基于数组g_到sort_整数的比较器。也许这就是问题的原因。
public class IndirectedComparator implements Comparator<Integer> {
private Integer[] array;
private Integer[] index;
public IndirectedComparator(Integer [] array, Integer[] index){
this.array = array;
this.index = new Integer[index.length];
System.arraycopy(index, 0, this.index, 0, index.length);
}
@Override
public int compare(Integer i1, Integer i2) {
return Integer.compare(array[index[i1]], array[index[i2]]);
}
}
Original: 5 3 0 2 7 1 5 6 8 4 - Length: 10
Tags:
0 1 2 3 4 5 6 7 8
Unsorted numbers:
5 3 2 7 1 5 6 8 4
Sorted Tags:
4 2 1 8 0 5 6 3 7
Sorted Numbers:
1 2 3 4 5 5 6 7 8