Если это Java, вы всегда можете настроить хеш-таблицу, которая ассоциирует фамилии с массивом индексов строк матрицы, так что люди в этих строках имеют эту фамилию.
Или вы можете иметьмногоуровневая хеш-таблица, так что вы можете сделать m[index.get(lastName).get(firstName)]
.
Также, если вы хотите перебирать имена в лексикографическом порядке, вы можете заменить хеш-таблицу на TreeMap
.
Пример:
import java.util.*;
class Test{
public static void main(String[]args){
Object[][] m = new Object[][]{
{1, "Smith", "John"},
{2, "Stone", "Jack"},
{3, "Stein", "Robert"},
{4, "Stone", "Bob"}
};
//index.get(lastName) will return a map between
//first names and matrix row indices.
//index.get(lastName).get(firstName) returns the index
//in the matrix of the row pertaining to person (lastName, firstName)
TreeMap<String, TreeMap<String, Integer>> index =
new TreeMap<String, TreeMap<String, Integer>>();
//create index
for(int i=0;i<m.length;i++){
Object[]o = m[i];
String last = o[1].toString();
String first = o[2].toString();
TreeMap<String,Integer> index2 = index.get(last);
if (index2==null){
index2=new TreeMap<String,Integer>();
index.put(last, index2);
}
index2.put(first, i);
}
System.out.print("Smith, John -> ");
System.out.println(Arrays.toString(m[index.get("Smith").get("John")]));
System.out.print("Stone -> ");
System.out.println(index.get("Stone"));
System.out.print("Full index: ");
System.out.println(index);
}
}
Вывод:
Smith, John -> [1, Smith, John]
Stone -> {Bob=3, Jack=1}
Full index: {Smith={John=0}, Stein={Robert=2}, Stone={Bob=3, Jack=1}}
В приведенном мной примере недостаточно сопоставить фамилии с индексами строк, потому что вы, вероятно, можете иметь двух человек ста же фамилияОднако я сделал предположение, что у вас не будет двух человек с одинаковыми именами.В противном случае вам понадобится что-то вроде TreeMap<String, TreeMap<String, ArrayList<Integer>>>
, чтобы можно было найти всех с заданным именем (фамилия, имя).Если вы хотите осуществлять поиск по идентификатору, вам просто нужно создать второй индекс, сопоставляя идентификаторы с индексами строк, которые могут быть HashMap<Integer, Integer>
.
Для этого небольшого примера выиграть отимея индексы, поскольку они, вероятно, занимают больше места, чем сама матрица, но, вероятно, окупаются, если ваши записи большие.