2017-04-07 60 views
0

我有一個arrayList<Integer>arrayList<JLabel>。 Integer將金額保存爲整數,JLabel保留與字符串相同的值。我想從兩個標籤中隨機刪除元素。例如,如果20TL(t1是貨幣)在JLabel中刪除我想要刪除它在整數arrayList也。這很簡單。但是接下來我想計算ArrayList中剩餘金額的平均值。這是我的另一個arrayList來洗牌0到23個數字。因此,我刪除了IntList和JLabel列表中的相同元素。Java如何計算某個元素隨機刪除的arrayList的平均值?

ArrayList<Integer> Numbers = new ArrayList<Integer>(); 
      for(int n = 0; n<24; n++){ 
       Numbers.add(n); 
      } 
     Collections.shuffle(Numbers); 

然後這裏是我的兩個列表。

ArrayList<Integer> Money = new ArrayList<Integer>(); 
      Money.add(1); Money.add(5); Money.add(10); Money.add(25); Money.add(50); Money.add(100); Money.add(500); Money.add(1000); Money.add(2000); 
      Money.add(5000); Money.add(10000); Money.add(20000); Money.add(25000); Money.add(30000); Money.add(40000); Money.add(50000); Money.add(100000); Money.add(200000); 
      Money.add(300000); Money.add(400000); Money.add(500000); Money.add(750000); Money.add(1000000); Money.add(2000000); 

String[] para =new String[] {"1 TL","5 TL","10 TL","25 TL", "50 TL","100 TL","500 TL",//create an array for moneys 
       "1.000 TL","2.000 TL","5.000 TL","10.000 TL","20.000 TL","25.000 TL", 
       "30.000 TL","40.000 TL","50.000 TL","100.000 TL", 
       "200.000 TL","300.000 TL","400.000 TL","500.000 TL","750.000 TL" 
       ,"1.000.000 TL","2.000.000 TL"}; 
     ArrayList <JLabel> myLabel = new ArrayList<JLabel>(); 
     for(int i=0; i < 12 ; i++){ 
      JLabel holder = new JLabel(); 
      holder.setText(para[i]); 
      myLabel.add(holder); 
      p2.add(holder);//add the label to the panel 

     } 

      for(int j=12; j<para.length; j++){ 
      JLabel holder2 = new JLabel(); 
      holder2.setText(para[j]); 

      myLabel.add(holder2); 
      p3.add(holder2); 
     } 

這裏是我的ActionListener方法

private int asd = 0; 
///// some code  
myLabel.get(Numbers.get(asd)).setVisible(false); 
Money.remove(Numbers.get(asd)); 

去除款式。當我試圖刪除錢intarraylist的計算方法不能正常工作。因爲例如,如果Numbers數組的第一個元素是5,那麼50將被刪除。並且arrayList將會縮小。之後,當Numbers.get(asd)等於23時,int arraylist中不會有第23個元素。因爲它縮小了,沒有第23個元素。我希望我能很好地告訴我的問題。

ps:我試過用數組代替arraylist。但我無法計算出左派的平均值。因爲當某些元素被移除時,數組不會縮小。

+0

你看起來過於複雜的問題。爲什麼不使用'JList ',用'DefaultListModel '填充它,並只處理一個集合 - 這裏是列表模型。 –

+0

爲了獲得更好的幫助,事實上,讓我們充分快速地理解您的問題的最好方法是如果您要創建併發布[最小示例程序](http:// stackoverflow。COM /幫助/ MCVE),一個小而完整的程序,只有必要的代碼,以證明您的問題,我們可以複製,粘貼,編譯和運行而無需修改。 –

+0

對不起,我很抱歉。我嘗試它。但我看不到模型。請給我看。 –

回答

2

我會對該代碼進行很多更改。首先,我會嘗試創建一個值集合,這樣我就不必對平行集合進行更改,因爲我知道這會減少出錯的機率。對於這樣的事情,我會使用JList<Integer>並使用整數填充其模型,DefaultListModel<Integer>。然後,我可以使用設置爲土耳其語區域設置的NumberFormat貨幣實例輕鬆地將其顯示爲土耳其里拉。例如,如果我創造我的模型,像這樣:

private class MyCellRenderer extends DefaultListCellRenderer { 

    @Override 
    public Component getListCellRendererComponent(JList<?> list, Object value, int index, 
      boolean isSelected, boolean cellHasFocus) { 
     String textValue = tlFormat.format(value); // format the Integer to its currency String 

     // pass it into the super's renderer 
     return super.getListCellRendererComponent(list, textValue, index, isSelected, cellHasFocus); 
    }   
} 

這時如果:

// constants used to populate my model 
private static final Integer[] VALUES = { 1, 5, 10, 25, 50, 100, 500, 1000, 2000, 5000, 10000, 
     20000, 25000, 30000, 40000, 50000, 100000, 200000, 300000, 400000, 500000, 750000, 
     1000000, 2000000 }; 

// locale for Turkey used to get its currency 
private Locale trLocale = new Locale("tr", "TR"); 
// currency number formatter for Turkish Lira 
private NumberFormat tlFormat = NumberFormat.getCurrencyInstance(trLocale); 

// my JList's model 
private DefaultListModel<Integer> listModel = new DefaultListModel<>(); 
// create the JList with its model 
private JList<Integer> jList = new JList<>(listModel); 

// elsewhere in my constructor 
    // populate my list model with the array values 
    for (Integer value : VALUES) { 
     listModel.addElement(value); 
    } 

    // set my JList's renderer to render the numbers as Turkish Lira 
    jList.setCellRenderer(new MyCellRenderer()); 

    // add my list to a JScrollPane and set how many rows are visible 
    jList.setVisibleRowCount(10); 
    JScrollPane scrollPane = new JScrollPane(jList); 

的Jlist的單元格渲染器將其持有,這裏一個整數,一個字符串表示土耳其里拉更改值後來我在一個按鈕的ActionListener的從列表中刪除選定的值,並將它稱之爲計算所有項目的列表中舉行的平均的方法:

@Override 
public void actionPerformed(ActionEvent e) { 
    List<Integer> selectedValues = jList.getSelectedValuesList(); 
    for (Integer selectedValue : selectedValues) { 
     listModel.removeElement(selectedValue); 
    } 

    // method elsewhere that iterates through the listModel, calculates an average 
    // and displays it 
    calculateAndDisplayAverage(); 
} 

它可能看起來,比如s ○:

enter image description here

+0

非常感謝你爲你的努力。對此,我真的非常感激。 –

1

我會推薦地圖:即HashMap<Integer, JLabel> money。這將確保您的兩個數據集同步。

對於一般的,Java的8流是非常方便的:

Collection<Integer> amounts = money.keySet(); double average = (double) amounts.stream().mapToInt(i -> i).sum()/amounts.size()

+0

感謝您的作品太 –

+0

@ M.Aktas答案:如果他的回答幫助,通過點擊向上箭頭做贊成票它。 –

+0

我不能這樣做。因爲我沒有15的聲望。 –