Вызов элементов объекта из списка объектов

#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 Пожалуйста, примите ответ, если вы сочтете его удовлетворительным. Если нет, пожалуйста, прокомментируйте, что можно улучшить, или если отсутствуют какие-либо детали для решения вашей проблемы. 🙂