Как хранить массив пар в java?
Я новичок в java, я хочу сохранить массив пар двухлокальных. Мой код выглядит следующим образом:
import java.util.ArrayList;
import java.util.Map.Entry;
List<Entry<Double, Double>> values = new ArrayList<>();
Entry<Double, Double> pair;
// set pair values:
// pair.setKey(0.5); // this method does not exists
// pair.setValue(3.6);
values.add(pair);
Как инициализировать переменную пары?
Есть ли лучшая структура для хранения моего массива пар двойных чисел?
Ответы
Ответ 1
Создайте свой собственный класс для представления пары и добавьте конструктор, который принимает два аргумента:
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; }
}
См. этот ответ по причинам, почему Pair
не существует в Java: Что такое эквивалент С++ Pair < L, R > в Java?
Ответ 2
Вы не хотите использовать Entry it INTERFACE, а не CLASS. Этот интерфейс используется реализацией Set, когда вы вызываете entrySet() для класса, реализующего Map. Это в основном позволяет вам манипулировать реализованной Map, как если бы это был Set.
Что бы вы сделали (но не можете), это. Если вы попытаетесь сделать это, вы увидите ошибку компилятора в строках "Невозможно создать экземпляр типа Map.Entry". Это потому, что Map.Entry - это интерфейс, а не класс. Интерфейс не содержит реального кода, поэтому здесь нет реального конструктора.
Entry<Double, Double> pair = new Entry<Double, Double>();
Если вы посмотрите на приведенные ниже документы, вы можете ясно видеть вверху, что это "Интерфейс 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<Pair> values = new ArrayList<Pair>();
Pair pair = new Pair();
// set pair values:
pair.setY(3.6);
pair.setX(3.6);
values.add(pair);
}
}
Ответ 3
Вы можете использовать карту, чтобы решить эту проблему.
Ответ 4
Является ли Entry
классом, который вы определили? Вы создаете экземпляр с помощью new
.
Entry<Double, Double> pair = new Entry<Double, Double>(d1, d2);
Примечание. Я предполагаю, что вы определили конструктор, который принимает 2 удвоения, и у вас есть ссылки для d1
и d2
.
Я предлагаю вам НЕ использовать класс Map.Entry
. Семантика для этого класса такова, что значения являются ключом и значением, соответствующим способу работы Карт.
Ответ 5
Не могли бы вы просто использовать
public class MyClass<A,B> extends ArrayList{
private A first;
private B second;
public MyClass(A first, B second){
super();
this.first = first;
this.second = second;}
}
а затем добавить некоторую форму метода add, а также первый и второй методы доступа и мутатора? Я как бы новичок в программировании, но, похоже, это может сработать и быть доступным для вещей, отличных от DOUBLE (в случае, если вы хотите использовать другие типы, такие как Integer или даже String).
Ответ 6
Если у вас есть доступ к классу Entry, вы можете создать конструктор, который принимает ключ и значение как параметры.
Entry<Double, Double> pair = new Entry<Double, Double>(0.5, 3.6);
values.add(pair);
Ответ 7
Тип Map.Entry
, который вы пытаетесь использовать, является просто интерфейсом и поэтому не может быть создан. Если вы хотите (неверно) использовать внутренние типы Map
, то конкретная реализация Map.Entry
HashEntry будет вариантом.
Однако гораздо лучше реализовать собственный тип пары. Или использовать карту вместо массива, если это вам подходит.
Ответ 8
Другим подходом и, вероятно, самым эффективным способом хранения и массива двойных пар является использование одного массива удвоений и использование (2 * i) и (2 * я + 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<count ; ++i) {
System.out.printf("%d: (%f,%f)%n", i, values[i*2], values[i*2+1]);
}
}
}