Сравнить элементы одного массива - PullRequest
0 голосов
/ 31 марта 2009

У меня проблема со сравнением значений элементов массива. например Я хотел сравнить значение индекса 0 и индекса 2, а также индекса 1 с индексом 3 и так далее. С кодом ниже я предполагаю, что получить результат numOfdifferentShape равен 2, но я получаю 3. Как я могу решить эту проблему? :-(

int numOfdifferentShape=0;

myArray = {40.0, 40.0, 40.0, 40.0, 80.0, 40.0, 40.0, 40.0}

for (int a=0; int a<myArray.size(); a=a+2)
{
   for (int b=a+2; b<myArray.size; b=b+2)
   {
      if (!(myArray.get(a).equals(myArray.get(b) && myArray.get(a+1).equals(b+1)))
         numOfdifferentShape++;  
      break;
   }
}

Ответы [ 5 ]

4 голосов
/ 01 апреля 2009

В этом коде есть несколько синтаксических ошибок, но поскольку TofuBeer уже указал их в комментариях, я перейду к дизайну и логике.

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

Вы говорите, что пытаетесь выяснить, сколько объектов, которые вы храните (как два целых числа) в вашем массиве, равны. Для этого вы должны отслеживать, какие уникальные объекты вы уже видели. Затем вы сравниваете каждый объект со списком уникальных объектов и, если он не соответствует ни одному из них, добавляете его в список. Это основной алгоритм.

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

class Box { // or whatever the objects are called
    private final int height;
    private final int width;
    public Box(int h, int w) {
        height = h;
        width = w;
    }
    public int getHeight() {
        return height;
    }
    public int getWidth() {
        return width;
    }
    @Override
    public boolean equals(Object other) {
        if (!(other instanceof Box))
            return false;
        Box b = (Box) other;
        return b.height == height && b.width == width;
    }
    @Override
    public int hashCode() {
        int hash = 7;
        hash = 97 * hash + this.height;
        hash = 97 * hash + this.width;
        return hash;
    }
}

Постарайтесь понять, что делает каждая часть этого кода (особенно, если это на самом деле ваша домашняя работа). Получив его, перейдите к следующей части: выполните вычисления, которые вы пытались выполнить.

Допустим, у вас есть массив коробок, например:

Box[] boxes = {
    new Box(40, 40), new Box(40, 40), new Box(80, 40), new Box(40, 40)
};

(Я не могу сказать, используете ли вы массив или список, поэтому я просто выбираю один для демонстрации.)

Я уже дал алгоритм нахождения количества уникальных предметов, поэтому покажу, как его написать:

List<Box> unique = new ArrayList<Box>();
for (Box box : boxes) {
    if (!unique.contains(box)) { // this is why I implemented equals() and hashCode()!
        unique.add(box);
    }
}
int numOfDifferentShape = unique.size();

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

Вы могли бы сделать это еще проще с Set. Это будет выглядеть примерно так:

Set<Box> boxSet = new HashSet<Box>();
for (Box b : boxes)
    boxSet.add(b);
int numOfDifferentShape = boxSet.size();

Обратите внимание, что эти последние два фрагмента используют функции из Java 1.5 , поэтому я не знаю, сталкивались ли вы с ними раньше.

Это проясняет ситуацию?

3 голосов
/ 31 марта 2009
for (int i = 0; i < (myArray.size() - 2); ++i)
{
    if (myArray[i] != myArray[i + 2])
        ++numOfdifferentShapes;
}
2 голосов
/ 31 марта 2009

Я думаю, у вас проблема с круглыми скобками. Вы написали:

if (!(myArray.get(a).equals(myArray.get(b) && myArray.get(a+1).equals(b+1)))

когда я думаю, что вы имеете в виду:

if (!(myArray.get(a).equals(myArray.get(b)) && myArray.get(a+1).equals(b+1))

Также в той же строке вместо:

equals(b+1)

Вы не имеете в виду

myArray.get(b+1)
2 голосов
/ 31 марта 2009
  1. У вас есть две петли, ваше описание предполагает, что вы хотите только одну.
  2. Вам нужно выполнить проверку границ - хотите ли вы, чтобы n + 2 переносился в начало и в начало массива, когда он превышает длину?
1 голос
/ 01 апреля 2009

У меня есть список массивов, например {40,40,80,20,40,40} я хотел сравнить элементы. Четное количество индекс (например, индекс 0, индекс 2, индекс 4 и т. д.) представляет высоту объекта и нечетное число индекса (например, индекс 1, индекс 3 ес) представляет ширину объект. Итак, с кодом выше, Объект 1 (индекс 0 и 1).

Почему бы не создать массив класса Dimension, что-то вроде этого:

public class Dimension
{
    private final int width;
    private final int height;

    public Dimension(final int w, 
                     final int h)
    {
        width  = w;
        height = h;
    }

    public int getWidth()
    {
        return (width);
    }

    public int getHeight()
    {
        return (height);
    }
}

затем выполните цикл for примерно так:

for(int i = 0; i < array.length; i += 2)
{
    final Dimension a;
    final Dimension b;

    a = array[i];
    b = array[i + 1];

    // compare a.getLength() to b.getLength() 
    // or 
    // compare a.getWidth() to b.getWidth() 
}

Обычно это плохая идея, пытаться быть хитрым - говорить, что четные с лишними, а нечетные с длиной - хитро ... плохая идея ИМО.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...