0

我的代码中有一个问题,我需要将四个双打与其他四个双打进行比较。我尝试为此创建一个四维数组:

double[][][][] myArray = new double[][][][] {{{{1.1}, {1.2}, {1.3},{1.4}}}};

但问题是我不知道数组的大小,我需要能够动态地向它添加元素。我不熟悉数组列表,但我想知道这是否是解决方案?你能有多维数组列表吗?

编辑以更好地解释问题:

我有四个双打的原因是他们存储有关旅程的位置。

Double 1 = lattitude of start location. 
Double 2 = longitude of start location.
Double 3 = lattitude of end location. 
Double 4 = longitude of end location.

因此,我有 4 个与旅程相关的双打,我需要能够获取这些值并将它们与其他 4 个双打的集合进行比较,以查看这些位置是否在彼此合理的距离内。我已经解决了问题的那一面。它只是将一组 4 双打与 n 组进行比较是我想要做的。我最终希望能够运行每一个设置,以确定它们是否相似。

4

5 回答 5

0

首先,没有理由使用 4 维数组。无意冒犯,但这种代码看起来很难看

要动态地将元素添加到数组中,请改用ArrayList<Double>. 这个数据结构没有固定的大小。您可以像这样初始化它:

List<Double> dblList = Arrays.asList(1.1, 1.2, 1.3, 1.4);

或者

List<Double> dblList = new ArrayList<Double>(new Double[] {1.1, 1.2, 1.3, 1.4});

更新

抱歉,我刚刚意识到您想将多个列表相互比较。但是,这个答案应该能够帮助你。

于 2013-03-13T19:39:54.013 回答
0

根据我对您问题的理解,我认为多维数组不适合。鉴于您的四个双打,每个都具有重要意义,也许将它们分组到一个类中会更有意义。例如...

class JourneyCoords {
 private double latStart;
 private double latEnd;
 private double longStart;
 private double longEnd;
 JourneyCoords(double latStart,double latEnd,double longStart, double longEnd){
  this.latStart = latStart;
  this.latEnd = latEnd;
  this.longStart = longStart;
  this.longEnd = longEnd;
 }
 public Boolean isWithinReasonableDistance(JourneyCoords other){
  // What you define to be within reasonable distance
  return true;
 }
}

然后使用 JourneyCoords 对象的数组或列表,您可以在每个对象之间运行成对比较,如下所示:

JourneyCoords[] myJourneyCoords = new JourneyCoords[10];

// Initialization of values
for(int i=0;i<myJourneyCoords.length;i++){
 myJourneyCoords = new JourneyCoords(0.0,0.0,0.0,0.0);
}

// Pairwise comparison
for(int i=0;i<myJourneyCoords.length;i++){
 for(int j=i+1;j<myJourneyCoords.length;j++){
  if(myJourneyCoords[i].isWithinReasonableDistance(myJourneyCoords[j])){
   // These two are within reasonable distance
  }
 }
}

我没有测试代码,但希望你能明白这个概念。

于 2013-10-31T03:35:47.110 回答
0

要将 4 个双打的集合相互比较,您不需要 4 个维度,只需要 2 个。第一个维度是针对您拥有的多组双打,第二个维度是针对每个 4 个双打。

double[][] myArray = new double[2 /*sets*/][4 /*doubles each*/] = {
    {1.1, 1.2, 1.3, 1.4}, {2.1, 2.2, 2.3, 2.4}};

如果您需要添加到列表中,那么您可能想要ArrayList<ArrayList<Double>>添加 4 个双打列表。或者也许一个ArrayList<double[]>这样你就可以将 4 个双精度数组添加到一个正在增长的ArrayList.

于 2013-03-13T19:40:01.437 回答
0

如果我理解的话,你想要的是一个包含四个双精度对象的集合。

这可以使用List包含一些List的来表示Double。这样您就可以使用Java 的 api 的内置方法equalshashcode方法对您的. 因此,您可以拥有这样的代码:CollectionList<Double>

List<List<Double>> dblList = new ArrayList<List<Double>>();

并添加一些四个列表Double。这种方法的主要优点是您可以使用接口的方法检查两个子列表的相等equalsList

于 2013-03-13T19:42:39.257 回答
0

我对“set”这个术语有点困惑,因为这意味着双精度值的顺序无关紧要。根据您对问题的更新,我假设订单确实很重要。

如果您只想遍历现有值并调用您的方法,那非常简单:

List<List<Double>> doubles = new ArrayList<List<Double>>();
doubles.add(Arrays.asList(1.1, 1.2, 1.3, 1.4));
doubles.add(Arrays.asList(2.1, 1.2, 1.3, 1.4));
doubles.add(Arrays.asList(1.1, 1.2, 1.3, 1.4));
doubles.add(Arrays.asList(3.1, 1.2, 1.3, 1.4));

List<Double> newValue = Arrays.asList(1.1, 1.2, 1.3, 1.4);
for (List<Double> vals : doubles) {
    compareJourneys(newValue, vals); //this is your comparison method
}

如果事实证明我误解了您对“set”一词的使用,您可以使用 aList<Set<Double>>而不是 a List<List<Double>>

于 2013-03-13T20:13:03.687 回答