首页 > 代码库 > Android开发牛刀小试之“AA算钱软件”开发(二)

Android开发牛刀小试之“AA算钱软件”开发(二)

今天主要修改了几个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说我太屌丝了,无所谓啦,我就是图个开心。



Android开发牛刀小试之“AA算钱软件”开发(二)