2016-02-26 4 views
0

Я хочу напечатать все элементы массива Список объектов. Но он печатает только значения последнего элемента. Вот мой код:Я всегда получаю последнее значение объекта arraylist

List<items> boxes = new ArrayList<items>(); 
boxes.add(new items("1", 0.1f, 0.2f, 0.1f)); 
boxes.add(new items("2", 0.1f, 0.4f, 0.1f)); 
boxes.add(new items("3", 0.1f, 0.1f, 0.2f)); 
boxes.add(new items("4", 0.1f,0.1f, 0.3f)); 
boxes.add(new items("5", 0.2f, 0.1f, 0.1f)); 
boxes.add(new items("6", 0.1f, 0.1f, 0.1f)); 
boxes.add(new items("7", 0.2f, 0.3f, 0.1f)); 
boxes.add(new items("8", 0.1f, 0.3f, 0.1f)); 
boxes.add(new items("9", 0.2f, 0.2f, 0.2f)); 

for (items box: boxes){ 
    System.out.println(); 
    System.out.println("length: " +box.dimension.get("length")); 
    System.out.println("breadth: " +box.dimension.get("breadth")); 
    System.out.println("height: " +box.dimension.get("height")); 
} 

это класс предметов:

import java.util.*; 

public class items { 

    String boxNumber; 
    public static Map<String, Float> dimension = new HashMap<String, Float>(); 
    public double volume; 

    public items(float l, float b, float h) { 
     volume = l * b * h; 
     dimension.put("length", l); 
     dimension.put("breadth", b); 
     dimension.put("height", h); 

    } 

    public items(String boxName, float i, float j, float k) { 
     boxNumber = boxName; 
     volume = i * j * k; 
     dimension.put("length", i); 
     dimension.put("breadth", j); 
     dimension.put("height", k); 

    } 

    public static Map<String, Float> getDimension() { 
     return dimension; 
    } 

    public static void setDimension(Map<String, Float> dimension) { 
     items.dimension = dimension; 
    } 

    public items rotateBox() { 

     Set<String> keySet = this.dimension.keySet(); 
     String[] sides = keySet.toArray(new String[3]); 
     dimension.put(sides[1], 
       dimension.put(sides[2], dimension.get(sides[1]))); 
     dimension.put(sides[0], 
       dimension.put(sides[2], dimension.get(sides[0]))); 

     return this; 
    } 

    public double getVolume() { 
     // TODO Auto-generated method stub 
     return dimension.get("length") * dimension.get("breadth") 
       * dimension.get("height"); 
    } 
} 

И это то, что я всегда получаю:

length: 0.2 
breadth: 0.2 
height: 0.2 

length: 0.2 
breadth: 0.2 
height: 0.2 

length: 0.2 
breadth: 0.2 
height: 0.2 

length: 0.2 
breadth: 0.2 
height: 0.2 

length: 0.2 
breadth: 0.2 
height: 0.2 

length: 0.2 
breadth: 0.2 
height: 0.2 

length: 0.2 
breadth: 0.2 
height: 0.2 

length: 0.2 
breadth: 0.2 
height: 0.2 

length: 0.2 
breadth: 0.2 
height: 0.2 

Может кто-нибудь пожалуйста, скажите, что случилось с моим код?

+1

Не используйте 'static', если вы не хотите, чтобы все экземпляры имели одинаковые значения. –

+1

Не используйте карту, если вы должны использовать обычный объект с полями. Это плохо работает и подвержено ошибкам. –

+0

@ Питер Питер: Хорошо. Спасибо! –

ответ

3

Вы указали dimension как статическую переменную, which means it will be shared by all instances of your items class.

public static Map<String, Float> dimension = new HashMap<String, Float>(); 

Таким образом, каждый раз, когда вы создаете новый экземпляр, значения в карте перезаписываются

dimension.put("length", l); 
dimension.put("breadth", b); 
dimension.put("height", h); 

поэтому конечные значения вы получите являются значения последнего элемента вставленный.

Вы должны вместо этого сделать переменный экземпляр с:

public Map<String, Float> dimension = new HashMap<String, Float>(); 

В качестве побочного примечания:

  • Вы должны предпочесть private переменную экземпляра над казенными, и есть поглотитель.
  • Учитывайте соответствие именования Java: класс items должен быть Items.
+0

Это работает! Спасибо. –

0

Вы сделали измерение HashMap как статическую переменную, чтобы сохранить его значение и делиться всеми экземплярами класса элементов. сделать карту в качестве переменной-члена, объявляя его как

public Map<String,Float> dimension = new HashMap<String,Float>(); 

Эта переменная-член будет специфичны для каждого экземпляра класса элементов и могут быть доступны из конструктора с помощью «это» ключевое слово. Например: -

public items(String boxName, float i, float j, float k) { 
     boxNumber = boxName; 
     volume = i * j * k; 
     this.dimension.put("length", i); 
     this.dimension.put("breadth", j); 
     this.dimension.put("height", k); 
    } 
+0

Я понимаю, спасибо! –

Смежные вопросы