在Java/Android中正确使用for和if语句
我有两个数组,一个是cityUSA [i],另一个是decimalUSA [i]。每个有超过1500个条目,cityUSA [100]以及decimalUSA [100]等等。我发现这个城市的人们正在使用Android的定位服务,然后将其与我在cityUSA [i]数组中的城市列表进行比较。然后我搜索一个匹配,并使用匹配的i来找到该数组中的decimalUSA [i]的相关值。这里是代码:在Java/Android中正确使用for和if语句
loc.getLatitude(); loc.getLongitude(); Geocoder geocoder = new Geocoder(rate.this,Locale.ENGLISH);
try {
List<Address> addresses = geocoder.getFromLocation(loc.getLatitude(), loc.getLongitude(), 1);
TextView rateText = (TextView)findViewById(R.id.taxRate);
TextView locationText = (TextView)findViewById(R.id.taxLocation);
if(addresses != null) {
Address returnedAddress = addresses.get(0);
String city = returnedAddress.getLocality();
locationText.setText(city);
int i;
for (i = 0; i <= cityUSA.length; i++){
if (cityUSA[i] == city) {
String PrecentString = decimalRate[i];
rateText.setText(PrecentString);
break;
}
}
}
else{
locationText.setText("No City returned!");
rateText.setText("No Rate returned!");
}
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
TextView locationText = (TextView)findViewById(R.id.Rate);
locationText.setText("Cannot get Location!");
}
应用程序的炸弹,当我尝试运行它。如果我删除以下表述:
int i;
for (i = 0; i <= cityUSA.length; i++){
if (cityUSA[i] == city) {
String PrecentString = decimalRate[i];
rateText.setText(PrecentString);
break;
}
}
它不会弹出,但它然后又不执行搜索。
有什么建议吗?
除非你是不是,我看到一个直接的错误,您比较两个字符串用“==”操作符:
if(cityUSA[i]==city)
而是检查每个字符串的内容(是否它们相等):
if(cityUSA[i].equals(city))
而且,< =在for循环中会导致一个错误。把它保持为“<”。
另外,你是什么意思的“炸弹出”?如果你给出了一个特定的例外情况以及在哪条线上,这将会很有帮助。
你迭代次数太多(当然,这只会在城市不存在于数组中);应该是for (i = 0; i < cityUSA.length; i++){
。
至于为什么你可能找不到阵列中的城市,你可能会遇到区分大小写的问题。也许试试if (cityUSA[i].equalsIgnoreCase(city)){
。
谢谢克里斯你和Vinay的评论解决了我的问题,现在应用程序运行完美。非常感谢你。 – 63alfred 2011-05-05 06:00:46
首先,使用==
比较两个字符串对象,检查它们是否是相同的对象,而不是它们是否包含相同的字符串。您应该将字符串与.equals()
进行比较。其次,如果匹配失败(这是因为上面的原因,它可能会),你的数组索引将超出边界。中的有效索引为1到cityUSA.length-1
,而for
循环将继续到cityUSA.length
。第三,以这种方式拥有两个相互依赖的数组并不是很好的设计:应该有可能找到一个适合您需求的面向对象的模式。
谢谢eggyal,我会在我的代码中看看这个。 – 63alfred 2011-05-05 06:01:54
作为附加评论,请尽量遵守Java命名约定。我看到你有一个名为“PrecentString”的字符串(原文如此)。坚持命名约定会产生“percentString”。只是一个快速提示(当其他人阅读你的代码时很有用)。 – Vinay 2011-05-05 00:26:16