使用数组实现Set类

时间:2017-07-28 22:57:36

标签: java set dynamic-arrays

我的Java任务是使用数组实现set类。 该作业不允许我从库中导入集合类,所以我必须自己创建它。当我尝试打印出阵列时,它会重复输出重复的数字,而不是唯一的数字。我不知道问题出在哪里,所以如果你们能在我的代码中找到任何错误,那就太好了。我试图将数字2,3和4添加到集合中,因此结果应为2 3 4,但代码显示为2 3 2 3 2。 我认为问题的根源来自set类的add方法,但我不知道问题到底是什么。 import java.util.Arrays; public final class Set实现SetInterface {     private int [] set;     私有int大小;     私人能力;     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;             其他                 contains = false;         }         return contains;     }     public void add(int x)     {         for(int i = 0; i< capacity; i ++)         {             如果(!包含(X))             {                 if(size == capacity)                 {                     set = Arrays.copyOf(set,size * 2);                 }                 如果(将[I] == 0)                 {                     set [i ++] = x;                 }             }         }         大小++;     }     public boolean remove(int x)     {         boolean remove = false;         for(int i = 0; i< capacity; i ++)         {             if(x == set [i])             {                 set [i] = set [size -1];                 尺寸 - ;                 remove = true;             }             如果(的isEmpty())             {                remove = false;             }         }         返回删除;     }     public void clear()     {         set = null;         size = 0;     }     public int size()     {         回报大小;     }     public boolean isEmpty()     {         if(size == 0)             返回true;         其他             返回false;     }     public int [] toArray()     {         return Arrays.copyOf(set,capacity);     } } 这是我测试我的类的驱动程序类。 import java.util.Arrays; 公共类SetDriver {     public static void main(String [] args)     {         SetDriver driver = new SetDriver();         设置s1 = new Set(5);         s1.add(2);         s1.add(3);         s1.add(4);         driver.print(S1);         System.out.println(" Size:" + s1.size());     }    public static void print(Set s)     {         for(int i = 0; i< s.toArray()。length; i ++)         {             System.out.print(s.toArray()[i] +"");         }         的System.out.println("&#34);     } } 输出在这里: 2 3 2 3 2 尺寸:3

2 个答案:

答案 0 :(得分:1)

您的contains方法可能存在问题。假设您 找到了重复内容。会发生什么情况是您将变量分配给true并且继续迭代。这完全扼杀了逻辑;你可以有一个副本,但从不对它采取行动,因为你的布尔代码阻止你这样做。

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

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

答案 1 :(得分:0)

您应该像这样更改add方法。

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