我是Java的新手,我想存储一对双打的数组。 我的代码看起来像这样:
import java.util.ArrayList;
import java.util.Map.Entry;
List> 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变量?
是否有更好的结构来存储我的双打数组?
如果你不能打扰,你可以尝试:javatuples.org
stackoverflow.com/questions/521171/&hellip重复;
创建自己的类来表示一对,并添加一个带有两个参数的构造函数:
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 的等价物是什么?
我很惊讶没有什么东西可以在标准的java库中用于这么简单的事情
请参阅此答案,了解为什么不存在Pair的原因:stackoverflow.com/questions/156275/…
请注意,此解决方案会大大增加项目的复杂性,因为您可能有100个有效配对的不同类,但每个类都有不同的类型;需要在类型之间进行自定义编组,这既容易出错,又看起来很丑陋,而且价格昂贵(因为你不能从一个到另一个,然后缓存敌意)。如果所有的pairlike都实现了自己的marshallers,那就好了,这解决了除了性能和不同版本的对具有不同命名基本接口的所有问题,这可以通过没有接口和使用反射来解决,但现在你有其他问题。
你不想使用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);
}
}
很好,并且给你一个Pair(double,double)构造函数,我简化并删除setX / Y()调用并使用Pair pair = new Pair(3.6,3.6);
你不能用
public class MyClass extends ArrayList{
private A first;
private B second;
public MyClass(A first, B second){
super();
this.first = first;
this.second = second;}
}
然后添加一些形式的添加方法,以及第一和第二访问器&amp;变异法?我对编程很新,但这种方式似乎可以工作,除了DOUBLE之外的其他东西都可以访问(如果你想要使用其他类型的话,比如Integer,甚至String) 。
Entry是您定义的类吗?您使用new实例化它。
Entry pair = new Entry(d1, d2);
注意我假设你定义了一个带2个双精度的构造函数,并且你有d1和d2的引用。
我建议你不要使用Map.Entry类。该类的语义是这样的,值是一个键和一个值,适合地图的工作方式。
看看导入:"import java.util.Map.Entry;"
您可以使用地图来解决此问题。
如果每个"键"都是唯一的,则为true。 Map不允许重复键
两对可以具有相同的左数,即:[(2,6.3),(2,8.4)]
如果您将Double作为密钥,则必须查看此stackoverflow.com/q/1074781/1065197
另一种方法,也许是存储和双对数组的最有效方法是使用单个双精度数组,并使用(2 * i)和(2 * i + 1)作为索引方案。此外,您还可以获得在创建阵列时将阵列初始化为全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
System.out.printf("%d: (%f,%f)%n", i, values[i*2], values[i*2+1]);
}
}
}
您尝试使用的Map.Entry类型只是一个接口,因此无法实例化。如果你想(错误地)使用内部类型的Map,那么具体的Map.Entry实现HashEntry将是一个选项。
然而,实现自己的Pair类型是一个更好的主意。或者如果适合您需要使用Map而不是数组。
如果您有权访问Entry类,则可以创建一个构造函数,该构造函数将key和value作为参数。
Entry pair = new Entry(0.5, 3.6);
values.add(pair);
我收到以下错误:Cannot instantiate the type Map.Entry