比较同一数组的元素

时间:2009-03-31 18:49:01

标签: java arrays comparison

我在比较数组元素的值时遇到了问题。 例如我想比较索引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 个答案:

答案 0 :(得分:4)

此代码中存在多个语法错误,但由于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,如下所示:

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中的功能,因此我不知道您之前是否遇到过这些功能。

这会让事情更清楚吗?

答案 1 :(得分:3)

for (int i = 0; i < (myArray.size() - 2); ++i)
{
    if (myArray[i] != myArray[i + 2])
        ++numOfdifferentShapes;
}

答案 2 :(得分:2)

  1. 你有两个循环,你的描述建议你只想要一个。
  2. 您需要进行边界检查 - 当超过长度时,您是否希望n + 2包装到数组开头的开头?

答案 3 :(得分:2)

我认为你有一个括号问题。你写道:

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)

答案 4 :(得分:1)

  

我有数组列表,例如   {40,40,80,20,40,40}我想   比较元素。偶数   index(例如索引0,索引2,索引4   etc)代表一个物体的高度   和指数的奇数(例如指数1,   index 3 ec)代表a的宽度   宾语。所以,使用上面的代码,   对象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() 
}

尝试变得“狡猾”通常是一个坏主意 - 说即使有些也有,而奇怪的是长度是棘手的...坏主意IMO。