лучший подход к хранению (int xIndex, int yIndex, Вид представления, строковое имя ячейки)

#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();