0

我想将值插入到列表中,但前提是这些值尚未包含在其中。到目前为止,我的代码创建了一个无限循环,因为当我将值添加到列表中时,列表的大小也会增加,因此无法满足 for 循环的终止条件。这是一个更大程序的一部分,e 是一种扩展 Point 的对象。注意:e 扩展点。e 有一个值(除了它从 Point 继承的坐标)。如果 List 为空,我会将 e 存储在列表中。列表的类型为 e。如果 List 不为空,我会检查与我输入的 e 具有相同点位置的 e 是否存在于列表中。我不检查 e 对象,而是检查 x 和 y 值是否匹配。更新代码:

    List<e> listClosestFirst = new LinkedList<e>();  

    if (listClosestFirst.isEmpty()) {
        listClosestFirst.add(e);
    }
    else {

        for (int i = 0; i < listClosestFirst.size(); i++) {
            if ((e.getLocation()).equals((listClosestFirst.get(i)).getLocation())) {
                // do nothing, move on      
            } // end if

            else {
                listClosestFirst.add(e);
            }

        } // end for loop

    } // end else statement

System.out.println("Closest First Memory: " + listClosestFirst);
4

2 回答 2

5

正如所指出的,您可以使用该方法contains()。但是,最好只使用Set而不是列表,因为默认情况下集合需要唯一性。

* 代码示例 *

    public void testPoints() {
        Set<E> setClosestFirst = new LinkedHashSet<E>();
        for (int i = 1; i <= 100; ++i) {
            //create 100 random points/planes
            //add them to the set
            E anotherRandomE = new E(Calendar.getInstance().getTime().getTime() * i);
            setClosestFirst.add(anotherRandomE);
        }
        System.err.println("There were " + setClosestFirst.size() + " unique points created.");
    }

    public class Point {
        protected int x;
        protected int y;
    }

    /* Kind of a bad name for a class...perhaps MyCustomPoint would be better.
       Longer names in Java are usually best.
     */
    public class E extends Point {
        private int plane;

        public E(long seed) {
            Random random = new Random(seed);
            int minPlane = 0;
            int maxPlane = 1;
            int xYMin = 0;
            int xYMax = 10;
            this.plane = random.nextInt(maxPlane - minPlane) + minPlane; // random plane between 0 and 10
            this.x = random.nextInt(xYMax - xYMin) + xYMin;
            this.y = random.nextInt(xYMax - xYMin) + xYMin;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (!(o instanceof E)) return false;

            E e = (E) o;

            if (this.x != e.x || this.y != e.y || this.plane != e.plane) return false;

            return true;
        }

        @Override
        public int hashCode() {
            return plane * x * y * 13;
        }
    }
于 2013-05-10T02:02:25.247 回答
1
boolean exist = false;
ListIterator<e> iterator = listClosestFirst.listIterator(0);

while (iterator.hasNext() && !exist) {
    exist = (e.getLocation()).equals((iterator.next()).getLocation());
}

if (!exist) {
    listClosestFirst.add(e);
}

由于您使用的是链表,因此迭代器效率更高。大约从 O(n!) 增强到 O(n)。

于 2013-05-10T02:07:15.983 回答