【问题标题】:Java Array sort by means of a comparatorJava Array 通过比较器进行排序
【发布时间】:2013-11-17 22:42:31
【问题描述】:

完整代码见:https://skydrive.live.com/redir?resid=7B7D2F11B13EF9C9!54468&authkey=!AD4fD8sGgc7oJIE

这是代码的一部分:

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_tosort_Integer、g_tag、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)

有人可以向我解释一下吗?谢谢。

【问题讨论】:

  • 你所有的变量名都非常规且难以阅读。
  • 在此处发布任何相关代码,请不要在链接中。
  • i1, i2, g_tosort_Integer, g_tosort_Integer[i1] 或 g_tosort_Integer[i2] 可以为空。使用调试器或日志语句找出是哪一个,然后修复错误。
  • ^ 正是@JBNizet 所说的。
  • @Sotirios Delimanolis:变量名是简单的英文并且易于阅读。我不知道你所说的非常规是什么意思。

标签: java arrays sorting nullpointerexception comparator


【解决方案1】:

这是如何解决的。我保留了你的类“结构”,但我冒昧地更改了变量名以更清楚我在做什么。您问如何对数组进行排序而不改变元素的顺序,而是改变它的索引。

这是代码。

    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();
       }

    }

比较器的编码如下:

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 

【讨论】:

  • 我不认为这是问题所在。对于原始数组 l_IntegerArray,l_length 为 10,l_loop 为 0..9。 g_tag 和 g_tosort_Integer 使用 g_sorted,它将是 9(从 0..8)
  • 拜托,请尝试让我知道它是否可以解决。你传递 9 作为索引(因为是你的计数),你必须传递 8(你的数组现在是 0-8 索引)
  • 当我将 8 作为 toIndex 传递时,我没有收到 NullPointerException,但数组未正确排序。当数组包含 0..n 中的元素时,toIndex 应该是 n+1(不包括)。 Strings, Arrays.copyOfRange ...
  • 我正在努力解决的问题是:当 g_exclude = 0 - 源数组 5 3 2 7 1 5 6 8 4 - 没有排除 - g_sorted = 9 - g_tag 和 g_tosort_Integer 元素来自 0.. 8 - 完美运行 - 源数组 5 3 0 2 7 1 5 6 8 4 - 1 排除 - g_sorted = 9 - 来自 0..8 的 g_tag 和 g_tosort_Integer 元素 - NullPointerException g_sorted g_tag 和 g_tosort_Integer 的内容完全相同。第一个完美,第二个导致 NullPointerException,
  • 我已经尝试了一切。其他参数,debugstatements(System.out.println)……但是问题还是没有解决。我正在使用基于数组 g_tosort_Integer 的比较器对数组 g_tag 进行排序。也许这会导致问题。
猜你喜欢
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
  • 2014-04-26
  • 2015-10-07
  • 2021-06-16
  • 1970-01-01
  • 2018-12-12
相关资源
最近更新 更多