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