Добавить исключение массива в операторе if - PullRequest
0 голосов
/ 08 декабря 2011

у меня есть один массив со следующими значениями [1,2,3,4,5]

Я хочу напечатать сообщение, когда мой массив содержит значения 1,2,3. Как мне это сделать? :)

int[] myarray = new int[] {1,2,3,4,5};
if ( ... ) {
    System.out.println("This array is on fire!");

Полагаю, вы могли бы сделать так:

if (myarray[0]==1 && myarray[1]==2 && myarray[2]==3) {
     .....
    }

но если это возможно, я буду избегать этого. Я хочу избежать позиции в массиве, являющейся фактором.

Ответы [ 9 ]

3 голосов
/ 08 декабря 2011

К несчастью Arrays.asList(myarray) не работает для int, как отмечено в комментариях, я забыл ... Поэтому используйте Integer как Array-Type или сначала конвертируйте в Integer-List:

   List<Integer> intList = new ArrayList<Integer>();
    for (int index = 0; index < myarray.length; index++)
    {
        intList.add(myarray[index]);
    }

как указано здесь , затем следуйте старому решению с этим списком:

if (intList.contains(1)  && intList.contains(2) && intList.contains(3)) {
...
}
2 голосов
/ 08 декабря 2011

Вы можете написать служебный метод следующим образом ( предполагает, что массив отсортирован заранее, смотрите обновление, если это не так ):

public static boolean checkIfOnFire(int[] arr, int... nums) {
    for(int n : nums) {
        if(Arrays.binarySearch(arr, n) < 0) {
            return false;
        }
    }
    return true;
}

Тест с:

int[] myarray = new int[] {1,2,3,4,5};

System.out.println(checkIfOnFire(myarray, 1, 2, 3));
System.out.println(checkIfOnFire(myarray, 1, 2, 7));

Печать:

true
false

Обновление

Так как я использую Arrays.binarySearch. Массив ввода для метода checkIfOnFire должен быть отсортирован, как в вашем примере.

Но если ваш массив может быть не отсортирован, тогда checkIfOnFire необходимо изменить следующим образом:

public static boolean checkIfOnFire(int[] arr, int... nums) {
    //make a copy of the original array
    int[] copyArr = new int[arr.length];
    System.arraycopy(arr, 0, copyArr, 0, arr.length);
    //sort the copy
    Arrays.sort(copyArr);
    for(int n : nums) {
        if(Arrays.binarySearch(copyArr, n) < 0) {
            return false;
        }
    }
    return true;
}
1 голос
/ 08 декабря 2011

Это не красиво, но если вы написали что-то вроде этого:

public static boolean containsAll(int[] arrayToTest, int... values) {
    return asList(arrayToTest).containsAll(asList(values));     
}

public static List<Integer> asList(int[] values) {
    List<Integer> asList = new ArrayList<Integer>(values.length);
    for (int intVal : values) {
        asList.add(intVal);
    }
    return asList;
}

Затем вы можете назвать это так:

int[] myarray = new int[] {1,2,3,4,5};
boolean result = containsAll(myarray, 1, 2, 3);
0 голосов
/ 08 декабря 2011

Из-за широкого использования коллекций java, рассматриваемый как коллекция, является платформой, и каждая коллекция, состоящая из метода, содержит (Объект o), чтобы проверить, существует ли элемент в коллекции.

  1. поэтому сначала мы можем преобразовать массив int [] в список

    List<Integer> list=new ArrayList<Integer>();
            int[] myarray = new int[] {1,2,3,4,5};
            for(int i=0;i<myarray.length;i++)
            {
                list.add(myarray[i]);           
            }
    
  2. . Пожалуйста, используйте list.contains (объект o) дляпроверьте, существует ли он или нет

     for(Integer i:list)
            {
                if(list.contains(1)&&list.contains(2)&&list.contains(3))
                {
                    flag=true;
                    break;
                }
    
            }
    

и проверьте полный код ниже

import java.io.IOException;
import java.util.ArrayList;

import java.util.List;



public class Test {


    public static void main(String[] args) throws IOException {
        boolean flag=false;
        List<Integer> list=new ArrayList<Integer>();
        int[] myarray = new int[] {1,2,3,4,5};
        for(int i=0;i<myarray.length;i++)
        {
            list.add(myarray[i]);           
        }
        for(Integer i:list)
        {
            if(list.contains(1)&&list.contains(2)&&list.contains(3))
            {
                flag=true;
                break;
            }

        }

        if(flag)
        {
            System.out.println("yes contain");

        }
        else
            System.out.println("NO");

    }

}
0 голосов
/ 08 декабря 2011

Используйте метод containsAll в интерфейсе Collection.

Collection<Integer> coll = new ArrayList<Integer>();
Collection<Integer> test = new ArrayList<Integer>();

for( int i=1; i<=5; i++)
    coll.add(i);

test.add(1);
test.add(2);
test.add(3);

System.out.println(coll.containsAll(test));
0 голосов
/ 08 декабря 2011

Поместите его в коллекцию или список и сделайте содержимое для каждого элемента, который вы ищете.

Integer[] myarray = {1,2,3,4,5};
List<Integer> intList = Arrays.asList(myArray);

if (intList.contains(1) && intList.contains(2) && intList.contains(3))
    // print your message
0 голосов
/ 08 декабря 2011

Чтобы найти элементы в любом порядке в массиве, сначала добавьте интересующие вас элементы в хэш-карту. Затем посмотрите, есть ли они в массиве.

Время выполнения: O (m) для добавления на карту, для перебора массива O (n), m

В приведенном ниже коде вызовите main () для запуска примера, который я написал.

 Map<Integer,Boolean> lookFor = new HashMap<Integer,Boolean>();

 void main(){
    int[] array = new int[] {1,2,3,4,5};
    addMeaningfulValues();
    System.out.println( arrayHasValues(lookFor, array) );
 }

 void addMeaningfulValues(){
    lookFor.put(1,false);
    lookFor.put(2,false);
    lookFor.put(3,false);
 }

 boolean arrayHasValues(Map<Integer,Boolean> values, int [] array){
    //mark entries found in array
    for (int i=0; i<array.length; i++){
        if (values.containsKey(array[i])){
            values.put(array[i], true);
        }
    }

    //go over map entries and see if they have all been found in the array
    for (Boolean crtValue: values.values()){
        if (!crtValue){
            return false;
        }
    }

    return true;
 }
0 голосов
/ 08 декабря 2011

Если вы хотите, чтобы int были неотрицательными, маленькими и плотными;и вас не волнует порядок их появления в ints, тогда:

BitSet wanted = new BitSet();
wanted.set(1);
wanted.set(2);
wanted.set(3);

for (int i : ints) {
  wanted.clear(i);
}

boolean hasAll = wanted.cardinality() == 0;

Если вы заботитесь о порядке, то, возможно, вы захотите проверить, является ли один массив подпоследовательностью другого: Получить список индексов в соответствии подпоследовательности

0 голосов
/ 08 декабря 2011

Более длинное решение, но требует только одного прохода.Может быть легко настроен для проверки любого количества предметов.

public boolean onFire(int array[])
{
    boolean found1 = false;
    boolean found2 = false;
    boolean found3 = false;
    for (int i : array) {
        if(i==1)
        {
            found1= true;
            continue;
        }
        if(i==2)
        {
            found2= true;
            continue;
        }
        if(i==3)
        {
            found3= true;
            continue;
        }
        if(found1&&found2&&found3)
            return true;
    }
    if(found1&&found2&&found3)
         return true;
    return false;       
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...