我有一个整数数组列表。单击按钮时,文本字段中的数据被转换并作为int类型添加到数组列表中。这是我在
下面的代码public void onClick(View v) {
// TODO Auto-generated method stub
String rate = happy.getText().toString();
int rating = Integer.valueOf(rate);
counter += 1;
if (counter == 10) {
train();
}
if (rating > 0 && rating < 11) {
happyRating.add(rating);
test = happyRating.get(0);
Log.d("Value: ", Integer.toString(test));
} else {
InputAlertHandler.post(new Runnable() {
public void run() {
int duration = Toast.LENGTH_LONG;
CharSequence text = "Please enter Happiness Indicator between 1 and 10";
Context context = getApplicationContext();
inputAlert = Toast
.makeText(context, text, duration);
inputAlert.show();
}
});
}
}
在函数train()中;我从这个数组列表中获取数据,并在计算中使用它。
public void train() {
for (int i = 2; i < 12; i++) {
if (happyRating.get(i - 1) < happyRating.size()){
int x, x1, x2, y, y1, y2;
double learningRate = -0.00002;
x1 = happyRating.get(i - 1);
x2 = happyRating.get(i - 2);
y1 = iteration[i - 1];
y2 = iteration[i - 2];
x = x2 - x1;
y = y2 - y1;
if (x == 0) {
slope = 0;
} else {
slope = (y2 - y1) / (x2 - x1);
}
j++;
Log.d("J: ", Integer.toString(j));
double weightAdj = happyRating.get(j) * slope * learningRate;
weighting = (weighting + weightAdj);
Log.d("WEIGHTING: ", Double.toString(weighting));// break;
}
else
{
break;
}
}
当我使用斜率进行计算时,我得到的是前两点的斜率,所以这就是为什么我在for循环中设置int I = 2。
我已经放入检查,以确保我没有得到一个索引越界异常。我的问题是,J和WEIGHTING都没有显示在我的logcat中。这是否意味着它们没有被计算或者我不知道,但它们被初始化为两个全局变量,所以至少这个值应该打印出来?我需要尽快弄清楚这一点,所以如果有人在那里,可以阐明这一点,我相信这是简单的东西,但我一直在看这个项目这么长时间我的眼睛受伤!!
谢谢!
代替
Log.d("WEIGHTING: ", Double.toString(weighting));// break;
在logcat控制台中声明一个关键字,例如"output"和write:
Log.d("output","WEIGHTING: "+Double.toString(weighting));// break;
日志的第一个参数。必须是您的logcat输出的关键字。
编辑
Logcat似乎不是问题所在。问题出在for循环上。如果你的happyRating肯定是10,会发生以下情况:
for (int i = 2; i < 12; i++) {
if (happyRating.get(i - 1) < happyRating.size()){
当i达到11时,它尝试从happyRating中获取第10项(因为你sub了1)。但是没有,最大值是第9项(因为java从0开始计数)。这里可以达到的最大大小是9,所以如果你需要执行12次for循环,你必须尝试另一种方法
编辑
对不起,我现在无法测试代码,如果有错误,请不要否定,我在家的时候再测试。但这应该也可以…
public void train() {
for (int i = 0; i < happyRating.size()-1; i++) {
if (happyRating.get(i) < happyRating.size()){
int x, x1, x2, y, y1, y2;
double learningRate = -0.00002;
x1 = happyRating.get(i+1);
x2 = happyRating.get(i);
y1 = iteration[i+1];
y2 = iteration[i];
x = x2 - x1;
y = y2 - y1;
if (x == 0) {
slope = 0;
} else {
slope = (y2 - y1) / (x2 - x1);
}
j++;
Log.d("J: ", Integer.toString(j));
double weightAdj = happyRating.get(j) * slope * learningRate;
weighting = (weighting + weightAdj);
Log.d("WEIGHTING: ", Double.toString(weighting));// break;
}
else
{
break;
}
}
在您的代码的这个修改中,for循环只迭代,直到happyRating达到最大大小-2。到目前为止,我可以看到,你想在每个循环中取每个第一项的值,然后用第一项减去第二项的值。此代码与您的代码的区别在于,您可以在没有异常的情况下获得最后一个值。在您的代码中,当循环达到最大值-1时,您尝试获取一个不存在的happyRating项目。例如,假设整数"i"的值为10。这就是你的代码所做的:
x1 = happyRating.get(i - 1);//x1 = happyRating.get(9)
x2 = happyRating.get(i - 2);//x2 = happyRating.get(8)
y1 = iteration[i - 1];//y1 = iteration[9]
y2 = iteration[i - 2];//y2 = iteration[8]
如果你的happyRating大小为最大值9,x1希望有一个不存在的值。ArrayList(或Array)的大小与项号不同。如果此大小为9,则最后一项的编号为8,因为Java/Android从0开始计数。所以,你拿不到9号物品。for循环表示,只要"i"小于happyRating.size(),就迭代。如果happyRating.size()为9,"i"迭代到8,然后结束迭代。如果happyRating.size()为9:
,这就是我的代码所做的修改。 x1 = happyRating.get(i+1);//x1=happyRating.get(8)
x2 = happyRating.get(i);//x2=happyRating.get(7)
y1 = iteration[i+1];//y1=iteration[8]
y2 = iteration[i];//y2=iteration[7]
循环只迭代到7,因为它说->迭代只要i小于happyRating,size()-1(小于表示最大8 -> -1表示7)。
应该可以:
日志。d("J: ", " + J);
和
日志。d("权重 : ", " + Double.toString(权重));