在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; 
        } 
       } 

它不会弹出,但它然后又不执行搜索。

有什么建议吗?

+0

作为附加评论,请尽量遵守Java命名约定。我看到你有一个名为“PrecentString”的字符串(原文如此)。坚持命名约定会产生“percentString”。只是一个快速提示(当其他人阅读你的代码时很有用)。 – Vinay 2011-05-05 00:26:16

除非你是不是,我看到一个直接的错误,您比较两个字符串用“==”操作符:

if(cityUSA[i]==city) 

而是检查每个字符串的内容(是否它们相等):

if(cityUSA[i].equals(city)) 

而且,< =在for循环中会导致一个错误。把它保持为“<”。

另外,你是什么意思的“炸弹出”?如果你给出了一个特定的例外情况以及在哪条线上,这将会很有帮助。

+0

正如Chris Schaffer所说,您可以使用equalsIgnoreCase()来忽略大小写差异(即纽约与纽约)。 – Vinay 2011-05-05 00:21:09

+0

另外,你必须使用“equals()”而不是“==”的原因是因为“==”将检查cityUSA [i]和city是否驻留在同一个内存位置(即它们是同一个对象)。“==”不检查cityUSA [i]和城市的内容是否相同。 – Vinay 2011-05-05 00:22:27

+0

正如你所指出的,由于使用了 2011-05-05 02:11:13

你迭代次数太多(当然,这只会在城市不存在于数组中);应该是for (i = 0; i < cityUSA.length; i++){

至于为什么你可能找不到阵列中的城市,你可能会遇到区分大小写的问题。也许试试if (cityUSA[i].equalsIgnoreCase(city)){

+0

谢谢克里斯你和Vinay的评论解决了我的问题,现在应用程序运行完美。非常感谢你。 – 63alfred 2011-05-05 06:00:46

首先,使用==比较两个字符串对象,检查它们是否是相同的对象,而不是它们是否包含相同的字符串。您应该将字符串与.equals()进行比较。其次,如果匹配失败(这是因为上面的原因,它可能会),你的数组索引将超出边界。​​中的有效索引为1到cityUSA.length-1,而for循环将继续到cityUSA.length。第三,以这种方式拥有两个相互依赖的数组并不是很好的设计:应该有可能找到一个适合您需求的面向对象的模式。

+0

谢谢eggyal,我会在我的代码中看看这个。 – 63alfred 2011-05-05 06:01:54