Java如何计算某些元素随机删除的arrayList的平均值?

时间:2017-04-07 16:44:57

标签: java arrays swing arraylist

我有arrayList<Integer>arrayList<JLabel>。 Integer将货币作为整数保存,JLabel保持与字符串相同的值。我想从两个标签中随机删除元素。例如,如果在JLabel中删除了20TL(tl是货币),我想在整数arrayList中删除它。这很简单。但后来我想计算ArrayList中剩余钱的平均值。这是我的另一个arrayList,用于将0到23个数字混洗。因此,我删除IntList和JLabel列表中的相同元素。

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);
        }

这是我的删除style.this in 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。但我无法计算左翼的平均值。因为当删除某个元素时,数组不会缩小。

2 个答案:

答案 0 :(得分:2)

我会对该代码进行大量更改。首先,我会尝试创建一个值集合,这样我就不必动摇对并行集合进行更改,因为我知道这样可以减少出错的几率。对于这样的事情,我使用// 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); 并填充其模型,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); } } 使用整数。然后,我可以使用设置为土耳其语语言环境的NumberFormat货币实例轻松地将其显示为土耳其里拉。例如,如果我像这样创建我的模型:

@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();
}

JList的单元格渲染器会将它所拥有的值(此处为整数)更改为土耳其里拉的字符串表示形式:

$roles = [];
Company::find(1)->users->foreach(function($user) {
    $roles = array_merge($roles, $user->roles);
});

然后,如果稍后我可以从按钮的ActionListener中的列表中删除选定的值,并让它调用一个方法来计算列表中所有项目的平均值:

with

看起来像这样:

Login example

答案 1 :(得分:1)

我会推荐一张地图:即HashMap<Integer, JLabel> money。这可以保证您的两个数据集同步。

对于平均而言,Java 8流非常方便:

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