В: Как разорвать цикл for внутри метода?

Итак, я пытаюсь выяснить, является ли массив a подмножеством массива b, и мой код выглядит следующим образом:

public class subset {
    public static boolean subset(int[]a, int[] b) {
        for(int i=0;i<a.length;i++){
            for(int j=0;i<a.length;j++){
                if(a[i]==b[j]){
                    return true;
                    break;
                }else{
                    return false;
                }
            }
        }
    }
    public static void main(String[]args){
        int[] a = {1,2,6};
        int[] b = {1,2,4,3,7,4,8,5};
        if (subset(a,b))
            System.out.println("Array 1 is  contained  in Array 2");
        else
            System.out.println("Array 1 is not contained in Array 2");
    }
}

И я получаю следующие ошибки: недостижимый оператор и отсутствующий оператор возврата. Что я хочу сделать, так это то, что когда условие if истинно, оно останавливает внутренний цикл for и продолжает внешний цикл for. заранее спасибо


person Massoud    schedule 14.05.2017    source источник
comment
Возможный дубликат массив является подмножеством другого массива   -  person tima    schedule 14.05.2017
comment
return выходит из метода, что означает, что любой код, размещенный после него в этом методе (здесь break), не будет выполнен, поэтому вы видите эту ошибку. Единственным исключением является раздел finally, если return был в разделе try.   -  person Pshemo    schedule 14.05.2017
comment
Ваш внутренний цикл неверен; он считает до a.length, в то время как вы явно хотите, чтобы он считал до b.length, поскольку переменная j проходит через b, а не a.   -  person Erwin Bolwidt    schedule 14.05.2017


Ответы (2)


2 вещи нужно исправить. Вам нужно удалить break и добавить return false в конце.

public static boolean subset(int[]a, int[] b) {
    for(int i=0;i<a.length;i++){
        for(int j=0;i<a.length;j++){
            if(a[i]==b[j]){
                return true;
                //break; remove this
            }else{
                return false;
            }
        }
    }
    return false; //add this
}

Кроме того, вы могли бы немного упростить это, сделав это вместо if..else

return a[i]==b[j];
person dumbPotato21    schedule 14.05.2017
comment
Это все равно не сработает, так как если i=2 и j=1, он вернет false без проверки остальной части массива. - person Massoud; 14.05.2017

Первая проблема такова:

return true;
break;}

вторая строка никогда не будет выполнена, потому что первая завершает выполнение метода. Решите, какую строку вы хотите здесь: вернуть значение или выйти из внутреннего цикла (я не предполагаю, что эта ветвь должна быть пустой, см. Ниже).

Вторая проблема заключается в том, что когда вы передаете пустой массив, циклы не выполняются, и метод не имеет возвращаемого значения. Здесь просто добавьте «return true» (или false, здесь совершенно произвольно) в конце метода.

Вы, вероятно, можете упростить тело цикла следующим образом:

if(a[i]!=b[j]){
    return false;
}
person lorenzo    schedule 14.05.2017