簡體   English   中英

JAVA - 如何從for循環外部訪問FOR循環內的變量

[英]JAVA - How to access variables inside a FOR loop, from outside the for loop

我的代碼是將RSS提要添加到列表中 - 最初的代碼只是從列表中的第一個位置提取一個提要,並將此對象添加到另一個列表中。

這是原始代碼:

public static List<Feed> getFeedsFromXml(String xml) {
      Pattern feedPattern = Pattern.compile("<feed>\\s*<name>\\s*([^<]*)</name>\\s*<uri>\\s*([^<]*)</uri>\\s*</feed>");


      Matcher feedMatch = feedPattern.matcher(xml);
      while (feedMatch.find()) {
          String feedName = feedMatch.group(1);
          String feedURI = feedMatch.group(2);
          feeds.add(new Feed(feedName, feedURI));
      }

      return feeds;
}

@POST
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public String addXmlFeed() throws IOException
{
    int i = 0;
    String stringXml = "<feed><name>SMH Top Headlines</name><uri>http://feeds.smh.com.au/rssheadlines/top.xml</uri></feed><feed><name>UTS Library News</name>";
    getFeedsFromXml(stringXml);
    Feed f = (Feed) feeds.get(0);
    feedList.add(f);
    String handler = "You have successfully added: \n"; 
    String xmlStringReply = "" + f + "\n";

    feedList.save(feedFile);
    return handler + xmlStringReply;

}

一切進展順利,然后我決定實現一個for循環來處理向列表添加多個feed,我嘗試了以下(只有第二個方法的代碼):

@POST
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public String addXmlFeed() throws IOException
{
    int i = 0;
    String stringXml = "<feed><name>SMH Top Headlines</name><uri>http://feeds.smh.com.au/rssheadlines/top.xml</uri></feed><feed><name>UTS Library News</name>";
    getFeedsFromXml(stringXml);
    for (Feed feed: feeds)
    {
        Feed f = (Feed) feeds.get(i++);
        feedList.add(f);
        String handler = "You have successfully added: \n"; 
        String xmlStringReply = "" + f + "\n";
    }

    feedList.save(feedFile);
    return handler + xmlStringReply;

}

現在我確定這是一個基本問題,但現在在線:

    return handler + xmlStringReply;

handlerxmlStringReply無法解析為變量,因為它們在FOR LOOP中。

這有什么簡單的方法嗎?

這兩個變量的范圍僅限於for循環。 要在循環外訪問它們,您需要通過在循環之前聲明它們來增加它們的范圍:

String handler = ""; 
String xmlStringReply = "";
for (Feed f: feeds) {
    feedList.add(f);
    handler = "You have successfully added: \n"; 
    xmlStringReply = "" + f + "\n";
}

feedList.save(feedFile);
return handler + xmlStringReply;

此外,您當前的代碼會在每個循環中覆蓋字符串的值,而您可能想要連接這些值。 在這種情況下,您可以使用StringBuilder而不是字符串連接:

StringBuilder xmlStringReply = new StringBuilder("You have successfully added: \n");
for (Feed f: feeds) {
    feedList.add(f);
    xmlStringReply.append(f + "\n");
}

feedList.save(feedFile);
return xmlStringReply.toString();

因為,現在它們已經超出了范圍。

除了原始錯誤 - 您可以使用其他建議輕松解決這個問題,我建議您不要將feeds作為實例變量。 我可以看到你的方法getFeedsFromXml()返回列表。 所以,我認為如果在該方法中定義該變量會更好。 然后,調用方法,如,

List<Feed> feeds = getFeedsFromXml(stringXml);

或者,如果這不能提供所需的行為,那么您應該將方法重命名為loadFeedsFromXml() 將其作為實例變量可能會導致線程問題

現在,嘗試改進你的循環,

StringBuilder xmlStringReply = new StringBuilder("You have successfully added: \n");
for (Feed feed: feeds) {
    feedList.add(feed);
    xmlStringReply.append(f + "\n");
}

feedList.save(feedFile);
return xmlStringReply.toString();

而且,我發現你的feedList也是一個實例變量。 這又會導致線程問題,因為它聽起來不可變或無狀態。 同步方法會給您帶來性能問題。 看看你是否可以將它作為本地方法。 一個經驗法則是盡可能縮小變量范圍

您需要將結果累積到變量中。 我正在使用StringBuilder因為它使字符串連接有效。

@POST
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public String addXmlFeed() throws IOException
{
    String stringXml = "<feed><name>SMH Top Headlines</name><uri>http://feeds.smh.com.au/rssheadlines/top.xml</uri></feed><feed><name>UTS Library News</name>";
    getFeedsFromXml(stringXml);

    StringBuilder replyBuilder = new StringBuilder("You have successfully added: \n");
    for (Feed feed : feeds)
    {
        feedList.add(feed);

        String xmlStringReply = feed  + "\n";
        reployBuilder.append(xmlStringReply); 
    }

    feedList.save(feedFile);
    return replyBuilder.toString();    
}

需要回答的問題是“如果添加多個Feed,我想要返回什么內容?”。

也許您想要返回"You have successfully added : feed1 feed2 feed3\\n"

在這種情況下,代碼是:

            StringBuilder response = new StringBuilder( "You have successfully added: ");
            for (Feed feed: feeds)
                {
                    feedList.add(feed);
                    response.append(f.toString()).append(" ");
                }
            feedList.save(feedFile);
            return response.toString();

順便說一句 ,你的feedf變量是一樣的和redondant!

不要寫:

int i = 0;    
for (Feed feed: feeds)
{
    Feed f = (Feed) feeds.get(i++);
    feedList.add(f);
}

for (Feed feed: feeds)
{
    feedList.add(feed);
}

一個好的經驗法則是查看這樣的范圍:

 { //This is a constructor

  int i;

} // This is a deconstructor

在curlies之間創建/實例化的任何東西都只存在於curlies中。 每當你使用變量和循環時:

for(int i = 0; i < 10; i++){

 //some code here
 } // after this curly i is no longer in scope or accessible.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM