#java #android #arrays #hashmap
#Ява #Android #массивы #хэш-карта
Вопрос:
Я работаю над небольшой библиотекой Android, и по определенной причине мне нужно сохранить такую структуру (
- int xIndex — x-индекс представления в табличной структуре
- int yIndex — индекс y представления в табличной структуре
- Вид вида — сам вид
- Строковое имя ячейки — это имя ячейки с координатами x, y в табличной структуре
таким образом,я могу позже обратиться к сохраненному представлению либо по (xIndex, yIndex), либо по его имени ячейки следующим образом:
View view = manager.getCell(xIndex, yIndex); //or View view = manager.getByName(cellName);
Я на самом деле хочу, чтобы эта реализация была как можно более простой, поэтому любые идеи о том, какую карту или что-то подобное я могу использовать, чтобы иметь возможность адресовать объекты там либо парой целых чисел, либо строкой? Я не хочу создавать промежуточный класс, подобный следующему
CellDefinition(int x, int y, String cellName)
так что позже это можно будет сделать так, как эта картаlt;Определение ячейки, видgt; скорее мне понадобится что-то вроде Objectlt;Integer[2], String, Viewgt;
таким образом, я могу позже обратиться к нему с помощью new[]{x,y}
или с помощью строки "cellName"
и получить объект представления по этим индексам.
Любые идеи приветствуются
Комментарии:
1. использование здесь промежуточного класса даст вам гораздо больше гибкости в будущем. если бы вы добавляли или удаляли поля в будущем, это было бы намного менее болезненно
2. Почему бы вам не захотеть создать класс, представляющий буквальную программную сущность? Вот для чего они там
Ответ №1:
Я полагаю, вы могли бы сделать что-то вроде Listlt;Maplt;String, Objectgt;gt;
того, где список представляет собой набор карт, которые занимают место объектов нового класса. Например, ваши пары значений ключей могут выглядеть следующим образом { "Name" : "CellName", "x" : 1, "y" : 2, "View" : viewObj}
Оттуда вы можете использовать поток и полученную карту для выбора вида:
Listlt;HashMaplt;String, Objectgt; list = ... //By name HashMaplt;String, Objectgt; selectedMap = list.stream() .filter(m -gt; m.get("Name").equals("SomeName")) .findFirst() .orElse(null); //Or by point HashMaplt;String, Objectgt; selectedMap = list.stream() .filter(m -gt; m.get("x") == 1 amp;amp; m.get("y") == 2) .findFirst() .orElse(null); View view = (View) selectedMapBy.get("View");
В этот момент, однако, может быть проще сделать что-то вроде Listlt;CustomClassgt;
этого, чтобы вам не приходилось иметь дело с ключами и типами «Объектов»:
Listlt;CellDefinitiongt; list = ... CellDefinition cell = list.stream() .filter(c -gt; c.getName().equals("SomeName")) .findFirst() .orElse(null); View view = cell.getView();