Java 使用数组实现Set类

Java 使用数组实现Set类,java,set,dynamic-arrays,Java,Set,Dynamic Arrays,我的Java任务是通过使用数组实现集合类 作业不允许我从库中导入set类,因此我必须自己创建。当我试图打印数组时,它重复打印数字,不是唯一的数字。我不知道问题出在哪里,所以如果你们能在我的代码中找到任何错误,那就太好了。我尝试将数字2、3和4添加到集合中,因此结果应该是2 3 4,但代码显示我2 3 2 我认为问题的根源是set类的add方法,但我不知道问题到底是什么 import java.util.Arrays; public final class Set implements SetI

我的Java任务是通过使用数组实现集合类

作业不允许我从库中导入set类,因此我必须自己创建。当我试图打印数组时,它重复打印数字,不是唯一的数字。我不知道问题出在哪里,所以如果你们能在我的代码中找到任何错误,那就太好了。我尝试将数字2、34添加到集合中,因此结果应该是
2 3 4
,但代码显示我
2 3 2

我认为问题的根源是set类的add方法,但我不知道问题到底是什么

import java.util.Arrays;

public final class Set implements SetInterface
{

    private int[] set;
    private int size;
    private int capacity;

    public Set(int c)
    {
        capacity = c;
        set = new int[capacity];
        size = 0;
    }

    public boolean contains(int x)
    {
        boolean contains = false;
        for(int i = 0; i<capacity; i++)
        {
            if(x == set[i])
                contains =  true;
            else
                contains = false;
        }
        return contains;
    }

    public void add(int x)
    {

        for(int i = 0; i<capacity; i++)
        {
            if(!contains(x))
            {
                if(size == capacity)
                {
                    set = Arrays.copyOf(set,size*2);
                }
                if(set[i]==0)
                {
                    set[i++] = x;
                }

            }
        }
        size++;
    }

    public boolean remove(int x)
    {
        boolean remove = false;
        for(int i = 0; i < capacity; i++)
        {
            if(x == set[i])
            {
                set[i] = set[size -1];
                size--;
                remove =  true;
            }
            if(isEmpty())
            {
               remove =  false;
            }
        }
        return remove;
    }

    public void clear()
    {
        set = null;
        size = 0;
    }

    public int size()
    {
        return size;
    }

    public boolean isEmpty()
    {
        if(size == 0)
            return true;
        else
            return false;
    }

    public int[] toArray()
    {
        return Arrays.copyOf(set, capacity);
    }
}

您的
contains
方法可能存在问题。假设你找到了一个复制品。发生的情况是,将变量赋值为
true
,然后继续迭代。这完全践踏了逻辑;您可以有一个副本,但决不能对其执行操作,因为您的布尔代码阻止您这样做

理想情况下,当您找到匹配项时,必须停止迭代并立即返回

public boolean contains(int value) {
    for(int setItem : set) {
        if(setItem == value) {
            return true;
        }
     }
     return false;
 }

您应该像这样更改
add
方法

public void add(int x) {
    if (contains(x))
        return;
    if (size >= capacity) {
        capacity *= 2;
        set = Arrays.copyOf(set, capacity);
    }
    set[size++] = x;
}

删除
else contains=falsecontains()
方法中的code>。您的
add()
方法没有意义。循环的用途是什么?如果最后一个元素相等,则当前的contains方法仅将
contains
变量设置为
true
,因为如果不相等,它将在最后一个元素再次将其设置为
false
,即使它以前是
true
public boolean contains(int value) {
    for(int setItem : set) {
        if(setItem == value) {
            return true;
        }
     }
     return false;
 }
public void add(int x) {
    if (contains(x))
        return;
    if (size >= capacity) {
        capacity *= 2;
        set = Arrays.copyOf(set, capacity);
    }
    set[size++] = x;
}