今天主要修改了几个bug,然后改了下背景图片和图标,添加了变动人数的功能,即:指定参与AA的人数,参与AA计算。还有就是利用getResources().getIdentifier()解决了循环调用layout中组件id的问题。
下面是几段核心代码:
private class OnClickListenerIreture implements OnClickListener{
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
//首先获取NUMBER,也就是要指定的参与AA的人数
EditText edt = (EditText) AAcharge.this.findViewById(R.id.ednum);
NUMBER = Integer.parseInt(edt.getText().toString());
int stuid[] = new int[NUMBER];
TextView stu[] = new TextView[NUMBER];
for (int k =1;k<stu.length+1;k++){
//get cost
stuid[k-1] = getResources().getIdentifier("stu"+k, "id", getPackageName());
stu[k-1] = (TextView) AAcharge.this.findViewById(stuid[k-1]);
}
double num[] = new double[NUMBER];
int payid[] = new int[NUMBER];
int nameid[] = new int[NUMBER];
Person p[] = new Person[NUMBER];
EditText ed[] = new EditText[NUMBER];
for (int i = 0;i<NUMBER;i++){
p[i] = new Person();
ed[i] = null;
}
for (int k =1;k<num.length+1;k++){
//get cost
payid[k-1] = getResources().getIdentifier("pay"+k, "id", getPackageName());
ed[k-1] = (EditText) AAcharge.this.popView.findViewById(payid[k-1]);
num[k-1] = Double.parseDouble(ed[k-1].getText().toString()); // 取得输入的钱数
p[k-1].setCost(num[k-1]);
//get name
nameid[k-1] = getResources().getIdentifier("myed"+k, "id", getPackageName());
ed[k-1] = (EditText) AAcharge.this.popView.findViewById(nameid[k-1]);
p[k-1].setName(ed[k-1].getText().toString());
}
double total =0;
for (int t =0;t<p.length;t++){
total = total + p[t].getCost();
}
double average = ((int)((total)*10/NUMBER))/10.0;
AAcharge.this.statusinfo.setText(
"总花费:" +String.valueOf(total)
+ " 平均花费:"+String.valueOf(average));
AAcharge.this.popWin.dismiss();
Calculate(average,p);
for (int j =0;j<stu.length;j++){
stu[j].setText(p[j].getInfo());
}
}
}
//主要的AA计算的算法,其实很简单,首先计算均值,然后每个人付的钱减去均值存到数组中,然后再从小到大排序,之后取第一个非零值,用非零值前面的负值去填这个非零值,直到等于零,再加1.
public void Calculate(double avg, Person p[]) {
// TODO Auto-generated method stub
int i =0;
int j =0;
int index=0;
sort(p);
for (int k =0;k<p.length;k++){
p[k].setGetmoney(p[k].getCost()-avg);
}
index = findPosIndex(p);
i=index;
for (j = index -1;j>=0;){
if (i<p.length){
if ((p[i].getGetmoney()+p[j].getGetmoney())>0){
p[j].setInfo(p[j].getName()+ "付给" + p[i].getName()+" : "
+String.valueOf(Math.abs(p[j].getGetmoney()))+"元;"+"\n"+p[j].getInfo());
p[i].setGetmoney(p[i].getGetmoney()+p[j].getGetmoney());
j--;
} else if ((p[i].getGetmoney()!=0) && ((p[i].getGetmoney()+p[j].getGetmoney())==0)){
p[j].setInfo(p[j].getName()+ "付给" + p[i].getName()+" : "
+String.valueOf(Math.abs(p[j].getGetmoney()))+"元;"+"\n"+p[j].getInfo());
p[i].setGetmoney(p[i].getGetmoney()+p[j].getGetmoney());
i++;
j--;
} else if((p[i].getGetmoney()+p[j].getGetmoney())<0){
p[j].setInfo(p[j].getName()+ "付给" + p[i].getName()+" : "
+String.valueOf(Math.abs(p[i].getGetmoney()))+"元;"+"\n"+p[j].getInfo());
p[j].setGetmoney(p[i].getGetmoney()+p[j].getGetmoney());
i++;
}
}
}
}
private int findPosIndex(Person[] p) {
// TODO Auto-generated method stub
int index =0;
for (int i =0;i<p.length;i++){
if(p[i].getGetmoney()>0) {
index = i;
break;
}
}
return index;
}
public void sort(Person p[]) {
// TODO Auto-generated method stub
Person temp =new Person();
for (int i =0;i<p.length-1;i++){
for (int j =0;j<p.length-i-1;j++){
if (p[j].getCost()>p[j+1].getCost()){
temp = p[j];
p[j] = p[j+1];
p[j+1] = temp;
}
}
}
}
}
最后是附上现在的app截图,有个girl说我太屌丝了,无所谓啦,我就是图个开心。