Преобразует массив в LinkedList

Я хотел бы преобразовать следующий код из массива в любой другой способ (самое главное эффективный), что означает, что есть бесконечное пространство, и мне не нужно будет устанавливать длину массива.

Как это может быть сделано? Как настроить неограниченное количество городов? используя LinkedList

  • Идея в том, что можно определить некую страну, в которой хранятся определенные города (название города, центр города, центральный автовокзал,... - как на картинке ниже) - В моем коде MAX_NUM_CITIES = 1000;

Преобразует массив в LinkedList

Мой код:

public class Country {
 //instance variables
 private String _countryName; // name of the country
 private City[] _cities; // Array of the cities 
 private int _noOfCities; //number of cities in a country

 public void CityArray() {
  _cities = new City[MAX_NUM_CITIES];
  _noOfCities = 0;
 }
 //constants:
 public final int MAX_NUM_CITIES = 1000;

 /**
  * Constructer for object in Country class construct Country with info accordingly
  * @param countryName represents the name of country
  * @param cities represents the cities array
  * @param noOfCities represents the number of cities
  */
 public Country(String countryName) {
  this._countryName = _countryName;
  this._noOfCities = _noOfCities;
  City[] cities = new City[MAX_NUM_CITIES];

 }
 boolean addCity(java.lang.String cityName, double XcityCenter, double YcityCenter, double XStationPoint, double YStationPoint, long numOfResidents, int numOfNeighborhoods) {
  if (_noOfCities <= MAX_NUM_CITIES) return false;
  _cities[_noOfCities++] = new City(cityName, XcityCenter, YcityCenter, XStationPoint, YStationPoint, numOfResidents, numOfNeighborhoods);
  return true;
 }

 public long getNumOfResidents() {
  long SumOfCities = 0;
  if (_noOfCities > 0) //empty Array           
  {
   SumOfCities = _cities[0].getNumOfResidents();
   for (int i = 1; i < _noOfCities; i++)
    SumOfCities += _cities[i].getNumOfResidents();
  } else
   SumOfCities = 0;
  return SumOfCities;
 }


 public String getCountryName() {
  return this._countryName;
 }

 public int getNumOfCities() {
  return this._noOfCities;
 }

 public City[] getCities() {
  int noOfCities = this._noOfCities;
  City[] cities = new City[noOfCities];
  for (int i = 0; i < _noOfCities; i++) cities[i] = new City(this._cities[i]);
  return cities;
 }

 public String toString() {
  if (_noOfCities == 0) //empty Array
   System.out.println("There are no cities in this country ");
  else
   for (int i = 0; i < _noOfCities; i++) _cities[i].toString();
  return toString();
 }
}

Вы имеете в виду как ArrayList?

rghome 18.01.2019 13:14

Возможный дубликат Размеры динамического массива Java?

J-Alex 18.01.2019 13:15
List<City> cities = new ArrayList<>();
Joakim Danielson 18.01.2019 13:16

Может Линкедлист? Список массивов? // Как я могу его преобразовать? не могли бы вы показать мои pls <3? @rghome

AnnaLA 18.01.2019 13:16
List<City> cities = new ArrayList<>(); ... cities.add(city); ... for (City c : cities) {}
Joop Eggen 18.01.2019 13:16

@JoopEggen Не могли бы вы объяснить, как это сделать с LinkedList?

AnnaLA 18.01.2019 13:19

Изменить только реализацию: new LinkedList<>(). Вот почему так замечательно использовать более общий тип List для переменной.

Joop Eggen 18.01.2019 13:20

@JoakimDanielson с LinkedList?

AnnaLA 18.01.2019 13:20

Я не вижу причин для LinkedList, вот руководство для ArrayList, он должен помочь вам с конвертацией. Это не так много работы.

Joakim Danielson 18.01.2019 13:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
9
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы отошел от массивов, если длина:

  • неизвестный
  • можно изменить

Я предлагаю использовать одну из различных реализаций List из JDK, а именно ArrayList и LinkedList.

Первый использует внутренний массив, который может быть расширен при добавлении элемента, что приведет к тому, что массив будет слишком маленьким (он делает это сам, так что не о чем беспокоиться).

Второй — это список узлов, что означает, что для каждого добавляемого элемента к последнему узлу добавляется новый (внутренний) объект узла.

Вам, конечно, придется изменить свой код для этого.

  1. Определите свой _cities как List<City>: private List<City> _cities
  2. Инициализируйте это с помощью желаемой реализации в конструкторе: _cities = new ArrayList<>(); или _cities = new LinkedList<>();.
  3. В вашем методе добавления вы можете просто вызвать: _cities.add(new City(cityName, XcityCenter, YcityCenter, XStationPoint, YStationPoint, numOfResidents, numOfNeighborhoods));
  4. В вашем getNumOfResidents вы можете использовать следующий фрагмент (который использует API потоковой передачи Java, представленный в java 8):

    return _cities.stream()
        .mapToLong(City::getNumOfResidents)
        .sum();
    
  5. для getCities() вам придется изменить тип возврата на List<City> и использовать следующее: return new ArrayList<>(_cities) или return new LinkedList<>(_cities) в зависимости от реализации, которую вы хотите использовать.

Не могли бы вы изменить мой код (по крайней мере, только первую часть — общедоступную страну и логическое значение addCity) на LinkedList, пожалуйста? <3

AnnaLA 18.01.2019 13:24

@AnnaLA, если вы будете следовать моим инструкциям 1-5, вам будет довольно легко сделать это самостоятельно.

Lino 18.01.2019 13:25

Другие вопросы по теме