LinkedHashMap или два отдельных массива в Java
У меня есть два массива предопределенной длины, скажем, 8, который содержит связанные данные. Я могу расположить их таким образом, чтобы массив1[0] соответствовал отображению в массиве2[0]. То есть пары ключ-значение имеют одинаковый индекс в обоих массивах. В таком случае для итерации массива я могу использовать цикл for, как показано ниже
for(int i=0;i<array1.length;i++){
int array1Val = array1[i];
String array2Val = array2[i];
//some code
}
Это подход гуд? Или лучше использовать вместо этого связанный hashmap и использовать цикл
map.entrySet()
Мудрость сложности и эффективности, который является лучшим подходом?
2 ответа
Практическое правило. Когда вы рассматриваете возможность создания соответствующих массивов, самое время создать класс для этих соответствующих данных и создать массив этого класса. Это самый понятный, самый читаемый, объектно-ориентированный способ хранения ваших соответствующих данных в объектах на Java. (Это не должно называться "Данные".)
class Data {
private int value1;
private String value2;
// Any other arrays? Make another value here.
// Constructor, getters, setters
}
Затем объявите массив этого класса и сохраните в нем объекты.
Data[] mydata = new Data[length];
for (int i = 0; i < length; i++) {
mydata[i] = new Data(); // and you can then initialize the Data object too.
}
Тогда один for
цикл может получить доступ к каждому Data
объект.
for (int i = 0; i < length; i++) {
Data data = mydata[i];
// Extract values here.
}
(Или вы также можете использовать расширенный цикл "foreach".)
for (Data data : mydata) {
// Extract values here.
}
Используйте карту.
С точки зрения производительности, вы перебираете всю длину структуры данных.
так что его только о (п)
чтение из карты - o(1), чтение из массива также o (1)
так что на самом деле нет разницы в производительности.
Но с точки зрения удобочитаемости и удобства обслуживания лучше иметь единую структуру данных "карта", чем две структуры данных массива, которые нужно использовать / использовать "особым образом" (в этом случае вам нужно помнить, что массив array1[0] отображает to array2[0]. Это делает код менее читаемым и более сложным, чем это должно быть.
Держите ваш код чистым, легким для чтения и простым, используйте карту:
Вот способы прохождения по карте в Java:
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
// ...
}
for (Object value : map.values()) {
// ...
}
[ОБНОВИТЬ]
В ответ на людей, которые предлагают "эй создать класс"...
Пожалуйста, спросите себя "кому нужно использовать эти данные"?
Если данные относятся только к внутреннему методу, я предлагаю использовать анонимный класс, как здесь:
public void myMethod(String param1, String param2) {
class MyAnonymousClass {
String data1;
String data2;
}
MyAnonymousClass anonymous = new MyAnonymousClass();
anonymous.data1 = param1;
anonymous.data2 = param2;
}
Если данные относятся только к внутренним элементам другого класса, то создайте закрытый статический внутренний класс.
pubic class SomeClass {
private static class MyDataContainer {
}
}
Просто будьте в курсе этих вариантов при создании классов.
Ура!