在arrayList中只允许一个负数

时间:2017-01-20 17:21:21

标签: java for-loop arraylist

我必须读取一个arrayList,如果有任何负数,则抛出异常,除了-1(在列表中是预期的)。我得到了如何查找负数但我无法弄清楚如何在列表中允许-1。

for(int i = 0; i <= list.size(); i++){
    if(list.get(i) <= 0){
        throw new IllegalArgumentException();
    }
}

3 个答案:

答案 0 :(得分:1)

为了允许一个唯一的否定,您可以继承ArrayList:

public class MyArrayList<T extends Number> extends ArrayList<T> {

    private boolean hasNegative = false;

    @Override
    public boolean add(T t) {
        if(t != null && t.floatValue() < 0) {
             if(hasNegative) {
                 throw new IllegalArgumentException("Negative element are not allowed anymore !");
             }
             hasNegative = true;
        }                 
        return super.add(t);
    }
}

使用它:

List<Integer> lst = new MyArrayList<Integer>();
lst.add(1);
lst.add(-1);
lst.add(3);
lst.add(-4); // Throw IllegalArgumentException because there is already -1

答案 1 :(得分:0)

如果列表中不允许使用负值,请使用其他列表类型

例如

class NonNegativeList extends ArrayList<Integer> {

    @Override
    public boolean add(Integer x) {
        if (x < -1) throw IllegalArgumentException();
        super.add(x);
    }   
}

至于&#34;在arrayList&#34;中只允许一个否定,添加一个布尔值

class NonNegativeList extends ArrayList<Integer> {

    boolean negativeAdded;

    @Override
    public boolean add(Integer x) {
        if (x < -1) throw IllegalArgumentException();
        if (negativeAdded) return;
        if (!negativeAdded && x < 0) {
            negativeAdded = true;
        }
        super.add(x);
    }   
}

答案 2 :(得分:0)

您的代码存在一些问题。首先,您应该在 i具有值list.size()之前停止循环。 (实际上,由于未使用元素的索引,您可以使用enhanced for loop,这是我在下面显示的内容。)其次,您需要测试所需的条件,而不是每个元素都是{{ 1}}。

您没有说明列表中包含哪种值。如果它们是整数类型(例如,<= 0),那么应该这样做:

Integer

如果它们是浮点类型(例如,for (Integer val : list) { if (val < -1) { throw new IllegalArgumentException(); } } ),则需要稍微复杂的测试来筛选像-0.5这样的值:

Float

另请注意,如果列表中包含for (Float val : list) { if (val < 0 && val != -1) { throw new IllegalArgumentException(); } } 个条目,您还需要对其进行测试(或者该方法将为此类列表抛出null的文档)。