#dart
Вопрос:
Я пытаюсь понять, как получить доступ к элементу объекта из списка объектов:
class ItemData {
var id;
var score;
var title;
var description;
ItemData({this.id, this.score, this.title, this.description});
}
//list of all items
var itemList = [
ItemData(id: 1, score: 30, title: 'mock title', description: 'mock description')
];
Я помещаю экземпляры ItemData в список элементов, а затем хочу отсортировать их от наивысшего балла до самого низкого. Я подозреваю, что мне нужен цикл for, но я не могу понять, как напечатать элемент «оценка» для индекса[0] списка элементов.
Комментарии:
1. Вы хотите, чтобы список оставался отсортированным во время вставки элементов, или вы хотите вставить все элементы, а затем отсортировать его?
2. Просто записка. Ваш
ItemData
должен быть набран, чтобы Dart знал, какого типа он может ожидать при получении данных из вашегоItemData
класса. Я зафиксировал ваш класс в своих примерах в своем ответе.3. Я хочу, чтобы все было отсортировано, пока я вставляю элементы. Спасибо за вашу помощь.
Ответ №1:
На мой взгляд, есть два способа, которыми вы можете это сделать. Первый-вставить все ваши ItemData
в свой itemList
, а затем позвонить sort()
по списку, чтобы отсортировать его:
import 'dart:collection';
class ItemData {
final int id;
final int score;
final String title;
final String description;
ItemData({
required this.id,
required this.score,
required this.title,
required this.description,
});
@override
String toString() => '{ID: $id : Score: $score}';
}
void main() {
final itemList = [
ItemData(
id: 1,
score: 30,
title: 'mock title',
description: 'mock description',
),
ItemData(
id: 2,
score: 15,
title: 'mock title',
description: 'mock description',
),
ItemData(
id: 3,
score: 50,
title: 'mock title',
description: 'mock description',
),
];
print(itemList);
// [{ID: 1 : Score: 30}, {ID: 2 : Score: 15}, {ID: 3 : Score: 50}]
itemList.sort((item1, item2) => item2.score.compareTo(item1.score));
print(itemList);
// [{ID: 2 : Score: 15}, {ID: 1 : Score: 30}, {ID: 3 : Score: 50}]
}
Другим решением было бы использовать a SplayTreeSet
, чтобы сделать a Set
ItemData
, которое автоматически сортируется по мере добавления ItemData
в набор:
import 'dart:collection';
class ItemData {
final int id;
final int score;
final String title;
final String description;
ItemData({
required this.id,
required this.score,
required this.title,
required this.description,
});
@override
String toString() => '{ID: $id : Score: $score}';
}
void main() {
final itemSet = SplayTreeSet<ItemData>(
(item1, item2) => item2.score.compareTo(item1.score),
);
itemSet.add(
ItemData(
id: 1,
score: 30,
title: 'mock title',
description: 'mock description',
),
);
print(itemSet);
// {{ID: 1 : Score: 30}}
itemSet.add(
ItemData(
id: 2,
score: 15,
title: 'mock title',
description: 'mock description',
),
);
print(itemSet);
// {{ID: 1 : Score: 30}, {ID: 2 : Score: 15}}
itemSet.add(
ItemData(
id: 3,
score: 50,
title: 'mock title',
description: 'mock description',
),
);
print(itemSet);
// {{ID: 3 : Score: 50}, {ID: 1 : Score: 30}, {ID: 2 : Score: 15}}
}
Последнее решение означает, что ваши данные могут быть помещены в a Set
, что означает, что дублированные элементы (элементы, которые считаются одинаковыми и генерируют один и тот же хэш-код) будут объединены.
Комментарии:
1. Я использовал ваше первое предложенное решение для достижения успеха. Одна вещь, которую я не понимаю, — это строка @переопределения toString() => ‘{новый список}’. Почему это позволяет печатать элементы? Если я этого не сделаю, я получу список: [Экземпляр ‘ItemData’, Экземпляр ‘ItemData’, Экземпляр ‘ItemData’]
2. Я добавил его, чтобы мне было легче выводить содержимое списка.
toString()
Метод вызывается для данного объекта, чтобы получитьString
представление объекта. При использованииprint()
он вызываетtoString()
метод для предоставленного объекта. В моем случае мы делаем это наList
(илиSet
), которые затем реализуются для вызоваtoString()
каждого элемента, который они содержат, чтобы создать полную описывающую строку.3. @JeremyParker Пожалуйста, примите ответ, если вы сочтете его удовлетворительным. Если нет, пожалуйста, прокомментируйте, что можно улучшить, или если отсутствуют какие-либо детали для решения вашей проблемы. 🙂