Ключевой объект модифицируется после вставки в HashMap - PullRequest
0 голосов
/ 14 мая 2019

Я читаю таблицу из Excel и передаю данные в карту hasp.Тем не менее, похоже, что один из элементов, используемых в ключе, перезаписывается после вставки.Я не могу понять, что не так.Буду очень признателен, если кто-нибудь сможет мне помочь.

// Определение класса AssetCity

public class AssetCity{
    public int asset;
    private int city; 
//constructors
//setters
// hashCode and Equals methods

В основной функции я сначала читаю таблицу Excel и создаю свою карту.

XSSFSheet _pi = myWorkbook.getSheet("pi"); //get the sheet              
Map<AssetCity, Integer> pi = new HashMap<AssetCity, Integer>(); //create map            
    for(int i = _pi.getFirstRowNum() + 1 ; i <= _pi.getLastRowNum(); i++){              
        AssetCity pair = new AssetCity();   
        Row ro = _pi.getRow(i); //get each row
    for(int j = ro.getFirstCellNum()+1; j <= ro.getLastCellNum()-1;  j++) {
    Cell ce = ro.getCell(j); //go through each column 
    pair.setAssetCity(i, j); //create the key that will be inserted
        int val = (int) ce.getNumericCellValue(); // get the cell value                      
      // System.out.println(pair.toString()+ " "+ val);
    pi.put(pair, val); // insert into the map
        }                       
}

Когда я использую System.out.println(pair.toString()+ " "+ val); перед операцией вставки, то, что я получаю, показано ниже, что правильно и соответствует значениям, которые у меня есть в Excel.

asset_city [asset=1, city=1] 0

asset_city [asset=1, city=2] 0

asset_city [asset=1, city=3] 0

.....

asset_city [asset=5, city=3] 1

asset_city [asset=5, city=4] 0              

Теперь, когда я закончу с циклом for, я перебираю все элементы на карте.

Iterator<Map.Entry<AssetCity,Integer>> itr1 = pi.entrySet().iterator();
    while(itr1.hasNext())
        {
          Map.Entry<AssetCity,Integer> entry = itr1.next();                 
                  System.out.println(entry.getKey().toString() + " = " + entry.getValue());

Теперь, как видите, значения городов в ключе выглядят одинаково.

asset_city [asset=2, city=4] = 0

asset_city [asset=3, city=4] = 0

asset_city [asset=4, city=4] = 0

asset_city [asset=5, city=4] = 0

asset_city [asset=1, city=4] = 0

asset_city [asset=2, city=4] = 1
asset_city [asset=3, city=4] = 0

asset_city [asset=4, city=4] = 0

asset_city [asset=1, city=4] = 0

asset_city [asset=2, city=4] = 0

asset_city [asset=3, city=4] = 1

asset_city [asset=1, city=4] = 0

asset_city [asset=2, city=4] = 0

asset_city [asset=1, city=4] = 1

asset_city [asset=5, city=4] = 0

asset_city [asset=4, city=4] = 0

asset_city [asset=5, city=4] = 0

asset_city [asset=3, city=4] = 0

asset_city [asset=4, city=4] = 1

asset_city [asset=5, city=4] = 1

Ответы [ 2 ]

2 голосов
/ 14 мая 2019

Поскольку пара AssetCity создается вне внутреннего цикла, эта созданная пара обновляется на каждой итерации цикла j.

Возможно, вы захотите создатьновый экземпляр пары AssetCity во внутреннем цикле, как в следующем фрагменте.Это будет означать, что это новый экземпляр каждой итерации внутреннего цикла 'j'.

XSSFSheet _pi = myWorkbook.getSheet("pi"); //get the sheet              
Map<AssetCity, Integer> pi = new HashMap<AssetCity, Integer>(); //create map            
for(int i = _pi.getFirstRowNum() + 1 ; i <= _pi.getLastRowNum(); i++){              
    Row ro = _pi.getRow(i); //get each row
    for(int j = ro.getFirstCellNum()+1; j <= ro.getLastCellNum()-1;  j++) {
        Cell ce = ro.getCell(j); //go through each column 
        AssetCity pair = new AssetCity();   
        pair.setAssetCity(i, j); //create the key that will be inserted
        int val = (int) ce.getNumericCellValue(); // get the cell value                      
        // System.out.println(pair.toString()+ " "+ val);
        pi.put(pair, val); // insert into the map
    }                       
}
2 голосов
/ 14 мая 2019

Вы перезаписываете данные в одном и том же объекте AssetCity для каждой ячейки в строке.

Чтобы исправить, объявить и инициализировать ваш AssetCity объект во внутреннем цикле вместо внешнего цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...