2014-02-23 84 views
1

對不起,我的英文不好。我會盡可能簡單地解釋我的問題;
我正在爲一個網站做一個應用程序客戶端。沒有社交網絡,但有博客。
現在我的應用程序下載每個請求的50個員額以下信息:
Java Android中的ArrayList性能

標題,作者,發表的類型,鏈接

它們存儲到ArrayList中以這樣的方式:

Title1,Author1,Type1,Link1,Title2,Author2,Type2,Link2 ... Title50,Author50,Type50,Link50

所以,我在ArrayList中有4 * 50 = 200個元素。
(請注意,此解析網頁時使用此ArrayList)。今後,我想存儲一些額外的信息,比如帖子的數據,喜歡的數量,鏈接到頭像等等。據我所知,50個帖子會要求在ArrayList中有600-800個元素。我擔心這會顯着降低我的Android應用程序的性能。

所以,問題是:你會如何建議存儲解析的數據?
在此先感謝。

我將展示一些代碼,以更好地說明問題:
在解析網頁與Jsoup我做以下的事情:

post_data = new ArrayList<String>(); 
for (Element e : entries) { 
post_data.add(e.select("title").text()); // title 
post_data.add(e.select("author name").text()); // author 
post_data.add(e.select("category").attr("term").toString()); // type 
Elements links_int = e.select("link"); 
    for (Element g : links_int) { 
    if (g.attr("rel").toString().equals("self")) { 
    post_data.add(g.attr("href").toString()); // post link (if there's one) 
    } else { continue; 
    } 
} 

正確的頁面解析後,我補我的數據scructure命名爲「項目」 (和數據結構來形成的ListView):

for (int i = 0; i < (post_data.size()); i += 4) { 
items.add(new WhatsNew_post_Item(
    WhatsNew.this.post_data.get(i), 
    WhatsNew.this.post_data.get(i + 1), 
    WhatsNew.this.post_data.get(i + 2), 
    WhatsNew.this.post_data.get(i + 3))); 
} 
+0

您是否希望信息永久或暫時保存? – Kakarot

+4

「恐怕這會顯着降低我的Android應用程序的性能。」你試過了嗎?對於ArrayList,800個元素非常小。沒有*測試*就沒有任何性能問題的「恐懼」。我會更關心你的數據表示 - 聽起來你應該有一個'ArrayList ',其中每個'Post'包含標題,作者,類型和鏈接...而不是'ArrayList '中的4個元素'每篇文章。 –

+0

此外,在你的情況下,如果你知道你將收到約50個帖子,那麼你可以初始化你的數組列表大小爲50,以避免不必要的時間來擴大數組列表時的數組列表的數目 posts = new ArrayList (50) ; – Kakarot

回答

3

創建一個數據結構保存有關職位的信息,並將該數據結構存儲在您的列表:

public class PostInfo { 
    private String author: 
    private String title; 
    // ... 
} 

// ... 

public List<PostInfo> postInfos = new ArrayList<>(50); 
// retrieve data and add it to the list 
+0

哦,我有這個結構,但它只用於在UI中填充ListView。呃..這個ArrayList(解釋有問題)用於解析網頁。 – Groosha

1

創建一個包含「標題,作者,帖子類型,鏈接」的類作爲實例變量。 閱讀下載的文章,並通過構造函數或setter方法傳遞變量來創建此類的對象。 將此類的對象存儲在ArrayList中。 通過這種方式,您可以在陣列列表中存儲50個50個對象的對象。

public class BlogPost { private String author: private String title; private String postType; 私人字符串鏈接; }

在您正在閱讀的下載帖主程序,你可以說

List<BlogPost> postList = new ArrayList<BlogPost>(50); 
BlogPost bPost = new BlogPost(author, title, postType, link); 
postList.add(bPost); 
1

如果你知道你有多少項目在列表中得到有能力創建的ArrayList:

new ArrayList<>(int capacity); 

默認情況下,新的ArrayList <>()具有10個元素的容量。如果達到容量,ArrayList將通過創建一個新數組並放入新舊對象來將當前容量加倍(10 - > 20 - > 40 - > 80 - > ...),之後舊數組將被銷燬垃圾收集器。