【问题标题】:Java-Sorting a 2-D array quicklyJava-快速排序二维数组
【发布时间】:2011-02-17 09:08:31
【问题描述】:

我有一个二维字符串数组,由 as 之类的值组成

{ "Home","0.1256784"  
 "Contact","-0.56789"  
 "Refer","1.36589"  
 "Next","3.678456" }

我必须根据第二个元素(双值)对数组进行排序,并获得类似的结果

{"Contact","-0.56789"  
 "Home","0.1256784"  
 "Refer","1.36589"  
 "Next","3.678456" }  

我使用了一些冒泡排序代码对其进行排序并且它有效,但是我必须知道如何以更快的方式使排序比我的排序更有效。我尝试了一些之前发布的代码来解决与我的问题相关的问题但我无法完成任务。
我的代码:

String tt="",tk="";
for(int i=1;i<myarray.length;i++)
 {  
for(int j=1;j<myarray.length-1;j++)
       {
       if(Double.parseDouble(myarray[i][1])<Double.parseDouble(myarray[j][1]))
            {
                    tk=myarray[i][1];  
                    tt=myarray[i][0];  
                    myarray[i][1]=myarray[j][1];  
                    myarray[i][0]=myarray[j][0];  
                    myarray[j][1]=myarray;  
                    myarray[j][0]=myarray;  


            }
          }
        }

【问题讨论】:

标签: java sorting multidimensional-array


【解决方案1】:
public class Sort2D {
  public static void main(String args[]) {
    String ss[][] = { 
      {"Home", "0.1256784"},
      {"Contact", "-0.56789"},
      {"Refer", "1.36589"},
      {"Next", "3.678456"}
    };
    Arrays.sort(ss, new Comparator<String[]>() {
      public int compare(String[] s1, String[] s2) {
        double d1 = Double.parseDouble(s1[1]);
        double d2 = Double.parseDouble(s2[1]);
        return Double.compare(d1, d2);
      }
    });
    for (String[] s : ss) {
      System.out.println(s[0] + ": " + s[1]);
    }
  }
}

【讨论】:

  • 为什么要覆盖等于?除了那个解决方案看起来不错+1
  • 感谢您的回复。我尝试了上面的代码,当我运行代码时会抛出一些 NullPointerException。它发生在 'Arrays.sort(ss, new Comparator( )'
  • @Aly - 很好,我删除了“等于”覆盖;我添加它是因为它出现在 Comparator 接口中,但这个简单示例不需要它,因为 Object 提供了默认实现。
  • @Naveen - 此代码自行编译和运行,您必须以某种方式将其放入您自己的代码结构中;我只演示了你问的部分。
  • 我成功了。我犯的错误是我从 ss[1][1] 开始数组而不是 ss[0][1]。所以它在读取 ss[0] 时报告了 NullpointerException ][1].非常感谢maerics..
【解决方案2】:

如果是二维数组,您可以使用Array.sort(String[], Comparator&lt;String[]&gt; comparator) 并传递一个自定义比较器,用于比较子数组的第二个元素。

【讨论】:

    【解决方案3】:

    您可以使用Arrays.sortsort(Object[] a, Comparator c) 并让java 来处理它。你可能会发现这个link很有用

    【讨论】:

      【解决方案4】:

      替代方法:您可以将数据复制到 TreeMap(以防所有双精度值都是唯一的)并让映射进行排序:

      Map<Double, String> map = new TreeMap<Double, String>();
      for (String[] row:myArray) {
         map.put(Double.parseDouble(row[1]), row[1]);
      

      entrysets 迭代器现在以升序返回值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-08
        • 2015-07-21
        • 2016-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-24
        相关资源
        最近更新 更多