确定集合中的元素编号:处理 null 和零元素

Determine element number in a set : handling null and zero element

我有一套简单的class。在class中,我有一些方法,例如:添加元素,计算集合大小等。代码如下:

import java.util.HashSet;
import java.util.Set;   
public class MySet {    
    public int numOfElem;
    public int totalNum;
    public int[] arraySet=new int[100];;
    Set<Integer> set=new HashSet<Integer>();

    public MySet()
    {
        numOfElem=0;
        totalNum=0;
        //int[] arraySet=new int[100];          
    }

    public void makeSet()
    {
      for(int i:arraySet)
          set.add(i);
    }

    public int size()
    {
        makeSet();
        numOfElem=set.size();
        return numOfElem-1;
    }

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

    public void clear()
    {
        int[] arraySet=new int[100];
        numOfElem=0;
        totalNum=0;
    }

    public boolean contains(int n)
    {
        boolean isContains=false;
        for(int i=0;i<totalNum;i++)
            {
              if(arraySet[i]==n)
                isContains=true;
            }
        return isContains;
    }

    public void add(int n)
    {   
        arraySet[totalNum]=n;
        makeSet();
        totalNum++;
    }
public String toString()
    {
        String str="";
        for(int i=0;i<totalNum;i++)
        str= str+arraySet[i]+" ";       
        return str;
    }  



    public static void main(String[] args) {
        MySet simpleSet =new MySet();
        simpleSet.add(1);
        System.out.println(simpleSet.set);
        System.out.println(simpleSet.size());
        System.out.println("Hello there!");
    }   
}

我的问题是

(1) 当我在集合中添加“1”时,集合会说我在集合中有[0,1],这很容易理解,因为当我初始化数组时,array[0- 99] 是 0。但是我怎样才能避免在这里输出 0?

(2)如果我用if语句来避免输出0,那是不明智的。因为如果我必须在集合中输入'0'怎么办,请问如何分析这道题?

您的 makeSet() 方法应该只添加不超过 totalNum 的项目,而不是整个 arraySet 数组。我还会更改 add() 中的执行顺序以避免潜在的不良行为:

public void add(int n)
{   
    arraySet[totalNum]=n;
    totalNum++;
    makeSet();
}

public void makeSet()
{
  for(int i=0;i<totalNum;i++)
      set.add(arraySet[i]);
}

请注意,这仅解决了您询问的问题,代码中还有许多其他问题。

另一种选择是使用 Integer 对象数组而不是 int,因为这样集合中每个元素的默认值为 null,因此您可以只检查 null,如下所示:

import java.util.HashSet;
import java.util.Set;

public class MySet {
    public int numOfElem;
    public int totalNum;
    public Integer[] arraySet = new Integer[100];
    ;
    Set<Integer> set = new HashSet<Integer>();

    public MySet() {
        numOfElem = 0;
        totalNum = 0;
        //int[] arraySet=new int[100];          
    }

    public void makeSet() {
        for(Integer i : arraySet) {
            if(i != null) {
                set.add(i);
            }
        }
    }

    public int size() {
        makeSet();
        numOfElem = set.size();
        return numOfElem - 1;
    }

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

    public void clear() {
        arraySet = new Integer[100];
        numOfElem = 0;
        totalNum = 0;
    }

    public boolean contains(int n) {
        boolean isContains = false;
        for(int i = 0; i < totalNum; i++) {
            if(arraySet[i] == n)
                isContains = true;
        }
        return isContains;
    }

    public void add(int n) {
        arraySet[totalNum] = n;
        makeSet();
        totalNum++;
    }

    public static void main(String[] args) {
        MySet simpleSet = new MySet();
        simpleSet.add(1);
        simpleSet.add(0);
        System.out.println(simpleSet.set);
        System.out.println(simpleSet.size());
        System.out.println("Hello there!");
    }
}

但是您可能不知道的是,一个 Set 不能存储两个相同的元素,所以如果您要将数字 1 加两次,您将只会在输出中得到它一次