2-мерный объект, который может расти в Java - PullRequest
1 голос
/ 11 августа 2011

Мне нужно связать уникальный ключ с каждым из нескольких объектов прямоугольника в Java. Ключ имеет тип данных double, и прямоугольники, очевидно, являются типами данных прямоугольника.

В настоящее время у меня есть прямоугольники в векторе, но они не очень полезны для меня, если я не могу также получить доступ к их ключам, как указано в первом абзаце выше.

Я бы сделал двумерный массив, где первый столбец является ключом, а второй столбец - прямоугольником, но количество строк в массиве нужно будет постоянно менять, поэтому я не думаю, что массив будет работать , Я изучил векторы и списки массивов, но меня беспокоит возможность поиска и среза данных.

Может кто-нибудь показать мне простой Java-код для создания и последующего доступа к двумерному набору данных с переменным числом строк?

В настоящее время мой прототип выглядит так:

ArrayList<Double> PeakList = new ArrayList<Double>();
Vector<Rectangle> peakVector = new Vector<Rectangle>();
Vector<Double> keyVector = new Vector<Double>();

if(PeakList.contains((double)i+newStartingPoint)){
    Rectangle myRect = new Rectangle(x2-5, y2-5, 10, 10);
    boolean rectFound = peakVector.contains(myRect);
    System.out.println("rectFound is:  "+rectFound);
              Double myPeak = ((double)i+newStartingPoint);
    if(rectFound!=true){
        peakVector.add(myRect);
                       keyVector.add(myPeak);
        System.out.println("rectFound was added.");
    }else{System.out.println("rectFound was NOT added.");}
}

Затем я перечисляю данные для последующей обработки с помощью чего-то вроде следующего:

Enumeration e = peakVector.elements();
    while (e.hasMoreElements()) {
        g2.fillRect(peakVector.lastElement().x, peakVector.lastElement().y, 10, 10);
    }

Как видите, невозможно впоследствии объединить ключи с прямоугольниками. Вот почему я ищу 2D-объект для использования. Может кто-нибудь показать мне, как исправить этот код, чтобы я мог связать ключи с прямоугольниками и впоследствии получить доступ к соответствующим образом связанным данным?

Ответы [ 3 ]

3 голосов
/ 11 августа 2011

Почему бы просто не использовать HashMap<Double, Rectangle>?

Редактировать: нет, с этим есть существенные проблемы, поскольку нет гарантии, что два двойных числа будут равны друг другу, даже если численно они должны. Должен ли он быть двойным? Можно ли использовать другое числовое или строковое представление, например Long? Есть ли физическая реальность, которую вы пытаетесь смоделировать?

2 голосов
/ 11 августа 2011

A Map наверняка будет правильным ответом, вам не нужно беспокоиться о количестве элементов в домене или кодомене функции отображения. Наличие double в качестве ключевого типа данных запрещает вам использовать некоторые из предопределенных типов.

Я бы пошел с TreeMap<Double, Rectangle> только потому, что для сортировки записей внутри структуры используется естественное упорядочение, поэтому вполне допустимо иметь двойное значение, но у вас возникнут проблемы с поиском (на самом деле я использовал плавающие числа как ключи для карт и никогда не было проблем с некоторыми мерами предосторожности, но это в основном зависит от характера ваших данных.

2 голосов
/ 11 августа 2011

Почему бы не использовать Map? Они специально разработаны для связи ключей со значениями. Вы можете перебирать ключи карты с помощью keySet(), значения с помощью valueSet() и одновременно ключи и значения с помощью entrySet()

...