2014-12-09 15 views
0

У меня есть два ArrayList, один из них является образцом Bitmap и содержит изображение, а другой - String, который содержит текст для растрового изображения.Как перемешать в том же порядке?

Я просто хочу перетасовать битмап, но String ArrayList должен быть в том же порядке.

private ArrayList<Bitmap> tmpBitmap = new ArrayList<Bitmap>(); 
private ArrayList<String> tmpName = new ArrayList<String>(); 

Я пробовал это, но он перемещается в разных порядках.

Collections.shuffle(tmpWord); 
Collections.shuffle(tmpName); 
+2

Я думаю, вы имеете в виду, что хотите, чтобы два параллельных списка имели одинаковые тасования. Вам было бы лучше помещать связанные предметы в объекты, а не использовать параллельные списки. – khelwood

+0

Как вы это понимаете? Можете ли вы разместить пример кода? – Unknown

+0

Теоретически вы можете создать два экземпляра java.util.Random с тем же самым семенем и указать один из них при первом перетасовке, а второй - во втором перемещении. Учитывая ту же длину и одну и ту же последовательность псевдослучайных чисел, shuffle будет производить ту же перестановку. Избавление от параллельных списков путем объединения полей в один объект может привести к увеличению количества поддерживаемых кодов. –

ответ

2

Измените два ArrayLists к Map<Bitmap,string> коллекции, то когда вы перетасовать вы получаете и перемешиваются, как вы ожидаете, и только доступ к одной коллекции, чтобы получить всю необходимую информацию. Хотя это требует, чтобы растровые изображения являются уникальными

* Благодаря kcoppock для заметив это Android/Java

+0

Правильно не заметил теги Android/Java: P –

+0

Вам все равно нужен один «Список» чтобы перетасовать их; вы обычно не можете перетасовать «карту». – khelwood

+0

Вы можете инициализировать 'List' из' Map' 'entrySet()'. –

4

Я сказал в комментариях, что вы бы лучше положить строки и растровые изображения в объекты вместе, чтобы вы не Не нужно поддерживать параллельные списки. Вот как это делается:

class NamedBitmap { 
    String name; 
    Bitmap bitmap; 
    // use privacy modifiers and accessors according to your taste 
    public NamedBitmap(String name, Bitmap bitmap) { 
     this.name = name; 
     this.bitmap = bitmap; 
    } 
} 

List<NamedBitmap> namedBitmaps = new ArrayList<NamedBitmap>(); 

... 

Collections.shuffle(namedBitmaps); 

Таким образом, имена всегда привязаны к растровым изображениям; вам не нужно сохранять два списка в одном порядке, чтобы поддерживать их.

Параллельные массивы (или списки) - это то, как люди должны были связывать связанные данные за время, прежде чем структуры и объекты предоставили лучшие варианты.

Edit:

Учитывая List<NamedBitmap> namedBitmaps, как описано выше, вы можете добавить материал в него с помощью:

namedBitmaps.add(new NamedBitmap(givenName, givenBitmap)); 

, и вы можете получить доступ имена и растровые изображения с помощью namedBitmaps.get(i).name и namedBitmaps.get(i).bitmap.

+0

Параллельные списки часто являются предупреждающим знаком о том, что два или более полей, принадлежащих одному и тому же объекту, обрабатываются отдельно. Они также представляют собой риск во время обслуживания программы: кто-то, когда-нибудь может сделать что-то в одном списке, но не в другом. –

+0

Хорошо, я понял, но что я должен вводить в классе? Я рисую битмап в onDraw, и я также читаю текст для него из списка массивов. В массиве у меня есть список текста для растрового изображения 0-29. – Unknown

+0

@Unknown См. Мое редактирование. Если это не то, что вы ищете, вам нужно быть более конкретным с вашим вопросом. – khelwood

1
long seed = new Random().nextLong(); 
Collections.shuffle(tmpWord, new Random(seed)); 
Collections.shuffle(tmpName, new Random(seed));