我有一个整数的arraylist。当有一个按钮单击时,文本字段中的数据将被转换并作为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();
}
});
}
}
在功能列车()中;我从这个数组列表中获取数据并在计算中使用它。
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。
我已经进行检查以确保我没有获得Index out of bounds异常。我的问题是,J和WEIGHTING都没有出现在我的logcat中。现在,这是否意味着它们没有计算或我不知道,但它们被初始化为两个全局变量,所以至少应该打印出这个值?我需要尽快弄清楚这一点,所以如果有人可以对此有所了解,我确信这很简单,但我一直在看这个项目这么长时间我的眼睛受伤!
谢谢!
答案 0 :(得分:0)
而不是
Log.d("WEIGHTING: ", Double.toString(weighting));// break;
在logcat控制台中声明一个关键字,例如“output”和write:
Log.d("output","WEIGHTING: "+Double.toString(weighting));// break;
Log的第一个参数。必须是您的logcat输出的关键字。
Logcat似乎不是问题所在。所以,问题出在for循环中。如果你的happyRating肯定是10,则会发生以下情况:
for (int i = 2; i < 12; i++) {
if (happyRating.get(i - 1) < happyRating.size()){
当我达到11时,它会尝试获得项目nr。 10来自happyRating(因为你分1)。但是没有,最大值是项目nr。 9(因为java从0开始计数)。你可以达到的最大尺寸是9,所以如果你需要执行for循环12次,你必须尝试另一种方式
很抱歉,我现在无法测试代码,如果有错误,请不要投票,我会在家时测试它。但这也应该有效......
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,因为它说 - &gt;迭代只要i小于happyRating,size() - 1(小于意味着最大8 - > -1意味着7)。
答案 1 :(得分:-1)
这应该有效:
Log.d(“J:”,“”+ j);
和
Log.d(“加权:”,“”+ Double.toString(加权));