Как хранить массив пар в java? - программирование
Подтвердить что ты не робот

Как хранить массив пар в 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);

Как инициализировать переменную пары? Есть ли лучшая структура для хранения моего массива пар двойных чисел?

4b9b3361

Ответ 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]);
        }
    }
}