2013-10-15 98 views
0

我正在开发一个Android应用程序。我需要根据另一个排序排序数组。我基于最低到最高排序一个(距离),并且需要根据距离对我的经度值进行排序。所以说,如果距离5的经度是41.2265,距离6的经度是41.2187,那么我需要对从最低到最高的距离{5,6}进行排序,然后根据它们的第一对排序经度。我已经读过,你可以用2D数组来做到这一点,但我不想这样做。我认为这也可以通过绘图来完成,但我不知道如何。我的代码如下:如何根据其他阵列对阵列进行排序

NearestStations.java的部分

  ArrayList<String> distancetos = new ArrayList<String>(); 
      ArrayList<String> longitudeArray = new ArrayList<String>(); 

      while(iterator.hasNext()){ 
      for (int i=0; i<144;i++){ 

      double distance = 0; 

      double lat_end = 0; 
      double lon_end = 0; 


      try { 
       lat_end = Double.parseDouble(iterator.next()); 
       lon_end = Double.parseDouble(iterator1.next()); 
       longitudeArray.add(Double.toString(lon_end)); 
       Log.i("Lon_end", String.valueOf(lon_end)); 

      } catch (NumberFormatException e) { 
       Log.v("Main", "Convert to Double Failed : "); 
      } 

      Location locationA = new Location("point A"); 
      locationA.setLatitude(latitude); 
      locationA.setLongitude(longitude); 

      Location locationB = new Location("point B"); 
      locationB.setLatitude(lat_end); 
      locationB.setLongitude(lon_end); 

      distance = locationA.distanceTo(locationB) * 0.000621371192237334; 
      Log.i("distancebefore", String.valueOf(distance)); 

      String dista = Double.toString(distance); 


      distancetos.add(dista); 
      } 
      } 


       Collections.sort(distancetos); 

       distancea = distancetos.get(0); 
       distance1 = distancetos.get(1); 

       String Longa = longitudeArray.get(0); 
       String Long1 = longitudeArray.get(1); 


       Log.i("distanceafter", String.valueOf(distancea)); 
       Log.i("distance1after", String.valueOf(distance1)); 


      String[] Stations = getResources().getStringArray(R.array.Stations); 
      String[] Longitude = getResources().getStringArray(R.array.Longitude); 
      String[] Latitude = getResources().getStringArray(R.array.Latitude); 



      Map<String, String> myMap = new HashMap<String, String>();{ 
      for (int i = 0; i <144; i++) { 
       myMap.put(Latitude[i], Stations[i]); 
      } 
      } 

      Map<String, String> myMap1 = new HashMap<String, String>();{ 
      for (int h = 0; h <144; h++) { 
       myMap1.put(Longitude[h], Stations[h]); 

      } 
      } 

      String value = myMap1.get(Longa); 
    } 
} 

谢谢您的帮助。

+0

我真的不能从你的代码中知道你正在尝试做什么,但我非常肯定排序字符串数组('distancetos')不是你想要的。由于字符'1'在'4'之前,因此这会比较“按字母顺序排列”(词典)顺序的内容并使“100.12345”显示小于“45.00032”。 – ajb

+0

@ajb这是我从未想过的事情。但是我会发现距离不到10英里,所以我不认为它会影响它。如我错了请纠正我。 – hichris123

+0

这是一般的不好的做法。如果你想比较数字,然后比较数字;不要比较字符串。你永远不知道什么时候一些意外的数据会回来咬你。 – ajb

回答

2

我相信这就是你要找的。

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collections; 
import java.util.List; 
import java.util.ListIterator; 

public class GenericCachedSorter { 
    public static void main(String[] args) { 
     List<Double> distances = new ArrayList<>(Arrays.asList(1d, 2d, 3d)); 

     sort(distances, new ToComparable<Double, Double>() { 
      @Override 
      public Double toComparable(Double distance) { 
       // return the longitude associated with this distance 
       return getLongitude(distance); 
      } 
     }); 

     for (Double distance : distances) 
      System.out.println(distances); 
    } 

    public interface ToComparable<T, C extends Comparable<? super C>> { 
     C toComparable(T t); 
    } 

    public static <T, C extends Comparable<? super C>> void sort(List<T> list, ToComparable<T, C> function) { 
     class Pair implements Comparable<Pair> { 
      final T original; 
      final C comparable; 

      Pair(T original, C comparable) { 
      this.original = original; 
      this.comparable = comparable; 
      } 

      @Override 
      public int compareTo(Pair other) { 
       return 
        comparable == null && other.comparable == null ? 0 : 
        comparable == null ? -1 : 
        other.comparable == null ? 1 : 
        comparable.compareTo(other.comparable); 
      } 
     } 

     List<Pair> pairs = new ArrayList<>(list.size()); 
     for (T original : list) 
      pairs.add(new Pair(original, function.toComparable(original))); 

     Collections.sort(pairs); 

     ListIterator<T> iter = list.listIterator(); 
     for (Pair pair : pairs) { 
      iter.next(); 
      iter.set(pair.original); 
     } 
    } 
} 
+0

对于'return getLongitude(distancetos);',''getLongitude(ArrayList )这一行的方法,未定义为新的Neareststations.ToComparable (){}'类型。有什么问题? – hichris123

+0

您需要在该行中执行的操作是返回与该特定距离相关的经度。 getLongitude(双重距离)方法不采用ArrayList参数。 – pscuderi

+0

啊,这是有道理的。你认为最简单的方法是什么?看起来他们还没有被排序,所以我可以long.get(0),那会得到索引0.我是否也需要一个迭代器呢? – hichris123

1

如何为他们上课?

public class Coord{ 
    private int id; 
    private double lat; 
    private double long; 

    public double getDistanceFrom(Coord coord); 

} 

这应该帮助你,因为它能够消除管理任务的位置 - 如果你在写C你的做法是一个很好的一个。但是你正在写Java。

此外:for循环将无声无息地失败,因为您在不检查hasNext()的情况下耗尽iterator。这只在外部循环完成。所以

int i=0; 
while(iterator.hasNext() && iterator1.hasNext()){ //also check iterator1 
    if(i>=144) break; //that's what your for loop essentially did 
     double distance = 0; 
     double lat_end = 0; 
     double lon_end = 0; 

     try { 
      lat_end = Double.parseDouble(iterator.next()); 
      lon_end = Double.parseDouble(iterator1.next()); 
      CoordArray.add(new Coord(lat_end, lat_long)); 
      Log.i("Lon_end", String.valueOf(lon_end)); 

     } catch (NumberFormatException e) { ... } 
//more stuff here 
i++; 
}/*while loop*/ 
相关问题