如何在java中存储一对数组?

我是java的新手,我想存储一对双打的数组。 我的代码如下所示:

import java.util.ArrayList; import java.util.Map.Entry; List<Entry> values = new ArrayList(); Entry pair; // set pair values: // pair.setKey(0.5); // this method does not exists // pair.setValue(3.6); values.add(pair); 

如何初始化pair变量? 是否有更好的结构来存储我的双打数组?

创建自己的类来表示一对,并添加一个带有两个参数的构造函数:

 public class MyPair { private final Double key; private final Double value; public MyPair(Double aKey, Double aValue) { key = aKey; value = aValue; } public Double key() { return key; } public Double value() { return value; } } 

请参阅此答案,了解Java中不存在Pair原因:Java 中的C ++ Pair 的等价物是什么?

你不想使用Entry这是一个INTERFACE,而不是CLASS。 当您在实现Map的类上调用entrySet()时,该接口由Set的实现使用。 它基本上允许您操纵已实现的Map,就像它是一个Set一样。

你会做什么(但不能)就是这样。 如果您尝试这样做,您将看到编译器错误的行“无法实例化Map.Entry类型”。 那是因为Map.Entry是一个接口,而不是一个类。 接口不包含任何实际代码,因此这里没有真正的构造函数。

 Entry pair = new Entry(); 

如果你看下面的文档,你可以在顶部清楚地看到它是一个“Interface Map.Entry”,这意味着它是一个界面。 http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Map.Entry.html

您应该做什么而不是尝试实例化一个接口,这是不可能的,就是创建一个名为Pair的类。 像这样的东西。 如果您使用以下代码,请记得更改包。

 package org.mike.test; public class Pair { private double x = 0.0; private double y = 0.0; public Pair(double x, double y) { this.x = x; this.y = y; } public Pair() { } public double getX() { return x; } public void setX(double x) { this.x = x; } public double getY() { return y; } public void setY(double y) { this.y = y; } } 

编写Pair类后,您的代码现在看起来像这样。

 package org.mike.test; import java.util.ArrayList; import org.mike.test.Pair; //You don't need this if the Pair class is in the same package as the class using it public class tester { /** * @param args */ public static void main(String[] args) { ArrayList values = new ArrayList(); Pair pair = new Pair(); // set pair values: pair.setY(3.6); pair.setX(3.6); values.add(pair); } } 

你能不能用

 public class MyClass extends ArrayList{ private A first; private B second; public MyClass(A first, B second){ super(); this.first = first; this.second = second;} } 

然后添加一些forms的add方法,以及第一个和第二个accessor&mutator方法? 我对编程很新,但这种方式似乎可以工作,除了DOUBLE之外的其他东西都可以访问(如果你想要使用其他类型,如Integer,甚至String) 。

您可以使用地图来解决此问题。

Entry是你定义的一个类吗? 你用new实例化它。

 Entry pair = new Entry(d1, d2); 

注意我假设你定义了一个带2个双精度的构造函数,并且你有d1d2引用。

我建议你不要使用Map.Entry类。 该类的语义是这样的,值是一个键和一个值,适合地图的工作方式。

如果您有权访问Entry类,则可以创建一个构造函数,该构造函数将key和value作为参数。

 Entry pair = new Entry(0.5, 3.6); values.add(pair); 

您尝试使用的Map.Entry类型只是一个接口,因此无法实例化。 如果你想(错误地)使用内部类型的Map ,那么具体的Map.Entry实现HashEntry将是一个选项。

然而,实现自己的Pair类型是一个更好的主意。 或者如果适合您需要使用Map而不是数组。

另一种方法,也许是存储和双对数组的最有效方法是使用单个双精度数组,并使用(2 * i)和(2 * i + 1)作为索引方案。 此外,您还可以获得在创建arrays时将arrays初始化为全0的优势,无需额外步骤。 不幸的是,实现add()和remove()会有一些额外的编码开销,但令人惊讶的是,它可能不如为该对创建自己的容器类。

 class MyClass { double[] values; int count; MyClass(int initialCapacity) { values = new double[initialCapacity*2]; } // adding a pair void addPair(double x, double y) { if (count*2 >= values.length) { values = Arrays.copyOf(values, values.length*2); } values[count*2] = x; values[count*2 + 1] = y; count++; } void remove(int index) { if (index >= count) throw new IndexOutOfBoundsException(); if (index < --count) { System.arraycopy(values, (index+1)*2, values, index*2, (count - index) * 2); } } int size() { return count; } // both these should check that index < count. double getX(int index) { return values[index*2]; } double getY(int index) { return values[index*2 + 1]; } void exampleIteration() { // getX/Y accessors are examples of how to get // the values, but it will be more efficient // in most cases to just access the array // array directly as so... for (int i=0 ; i