2016-03-31 1 views
0

Моя программа проверяет несколько булевых массивов (длина 30 каждый), и я хотел бы знать, уже ли я проверил этот массив. Я думал, что лучший способ справиться с этой проблемой - хранить все массивы и искать новый массив в наборе всех массивов, но я не знаю, какую структуру я должен использовать. Сначала, хотя хэш-таблица была бы лучшей, но похоже, что я не могу использовать их с массивами. Я искал набор и список, но я понятия не имею, что использовать!Сохраните и найдите, если определенный массив уже сохранен

Редактировать/уточнить: Привет, это мой первый вопрос здесь, и я удивлен, сколько ответов я получил, спасибо большое! Многие люди говорят, что они не уверены в том, что именно я ищу, поэтому я попытаюсь уточнить:

У меня есть несколько булевых массивов длиной 30, где порядок важен (порядок элементов в массиве).

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

+0

установить флаг для проверочного массива. ех. Определено логическое значение, такое как isChecked .... – logger

+0

Можете ли вы преобразовать свои массивы в списки? using 'public static Список asList (T ... a)' из java.util.Arrays. Это было бы удобно для использования с картами – Jorge

+0

На самом деле, для проверки отмеченного массива, есть ли у вас какой-либо ресурс, который я мог бы использовать? Чтобы быть ясным, я не хочу искать значение в массиве, я хочу искать, если два массива равны (для нескольких массивов). – z000by

ответ

1

Булевский массив - это в основном список бит. Поскольку размер массива равен 30, а int - это 32-битное значение, вы можете преобразовать массив в int.С помощью long вы можете поддерживать массивы размером до 64.

Таким образом, первый преобразовать массив в int:

private static int toBits(boolean[] array) { 
    if (array.length > 32) 
     throw new IllegalArgumentException("Array too large: " + array.length); 
    int bits = 0; 
    for (int i = 0; i < array.length; i++) 
     if (array[i]) 
      bits |= 1 << i; 
    return bits; 
} 

Затем следить за использованием Set<Integer>:

private Set<Integer> alreadySeen = new HashSet<>(); 

private boolean firstTime(boolean[] array) { 
    return ! this.alreadySeen.add(toBits(array)); 
} 

Это обеспечивает реализацию очень быстро и низко-памяти, которая может обрабатывать множество булевых массивов.

+0

Это, безусловно, более разумное решение. +1 –

+0

Выглядит очень хорошо спасибо! Последний вопрос, если бы мне пришлось преобразовать массив в int, я бы прошел через массив, умножив на 10 * индекс значение в индексе: (true, false true) = 1 + 10 * 0 + 100 * 1 = 101. Похоже, вы используете другую технику или просто другую нотацию? Какой был бы лучший способ конвертировать биты. – z000by

+0

@ z000by Не понимаю комментария. Я уже дал реализацию для преобразования массива в 'int', и он использует' 1 << i', а не умножить на 10. Биты - это логика base-2, а не base-10. – Andreas

-1

Вы можете использовать массив :)

Если у вас есть п массивы, а затем создать булев массив размера п. Назовем его checked [].

Так что если отмечено [5] == true, вы уже проверили пятый массив.

Другим вариантом является использование индекса 0 каждого массива в качестве «отмеченного флага».

+0

Ввод представляет собой 'boolean [30]', и вопрос заключается в том, был ли этот конкретный массив ранее замечен. – Andreas

0

Вы можете попробовать список смежности или, возможно, массив/arraylist объекта, который вы называете «Pair», например, если у этого объекта есть два атрибута, первый - это массив (массив, который вы проверили или еще не проверили), а второй атрибут - логическое значение, означающее, был ли этот массив посещен или нет.

0

Вы можете создать Wrapper class, который содержит массив (содержимое) и флаг. И, вместо хранения массива массивов, вы можете сохранить array объектов этого класса. Посмотрите на примере ниже:

public class ArrayWrapper { 

     private boolean checked; 
     private boolean[] content; 

     /** 
     * @return the checked 
     */ 
     public boolean isChecked() { 
      return checked; 
     } 
     /** 
     * @param checked the checked to set 
     */ 
     public void setChecked(boolean checked) { 
      this.checked = checked; 
     } 
     /** 
     * @return the content 
     */ 
     public boolean[] getContent() { 
      return content; 
     } 
     /** 
     * @param content the content to set 
     */ 
     public void setContent(boolean[] content) { 
      this.content = content; 
     } 
    } 

Теперь вы можете создать List<ArrayWrapper> или ArrayWrapper[], итерацию через него и набор проверяемого истина когда-то array (содержание) проверяется.

0

Использование Arrays.equals(array1, array2)

Этот метод возвращает истину, если два указанных массивов булевы равны друг другу. Два массива считаются равными, если оба массива содержат одинаковое количество элементов, а все соответствующие пары элементов в двух массивах равны.

Я даю вам решение грубой силы.

List<boolean[]> arrs = new ArrayList<>(); 
while (true) { 
    boolean[] receivedArr = receive(); 
    for (boolean[] existingArr : arrs) { 
     if (Arrays.equals(existingArr, receivedArr)) { 
      drop(receivedArr); 
      break; 
     } 
     arrs.add(receivedArr); 
    } 
} 
-1

Спасибо за разъяснение!

HashMap по-прежнему является хорошим ответом, используя Arrays.hashCode() для создания вашего ключевого объекта. Например:

HashMap<Integer, Boolean> checked = new HashMap<>(); 

/** 
* Returns true if already checked; false if it's new 
*/ 
public boolean isChecked(Boolean [] array) { 
    int hashCode = Arrays.hashCode(array); 
    Boolean existing = checked(hashCode); 
    if (existing == null) { 
     checked.put(hashCode, true); 
     return true; 
    } 
    return false; 
} 
+0

Не то, что он хочет –

+0

@KeqiangLi его комментарий к его сообщению, в котором говорится: «Я хочу искать, если два массива равны (для нескольких массивов)», поясняет это. Подход Arrays.hashCode() удовлетворяет требованию равенства. –

+0

Он также говорит: «Проверьте, есть ли равный массив (все тот же элемент, в том же порядке)» –

 Смежные вопросы

  • Нет связанных вопросов^_^