创建动态ArrayLists

时间:2012-12-26 16:39:15

标签: java arraylist dynamic-arrays

我遇到与“动态ArrayLists”相关的问题。我有一个包含用户名及其数据的列表。我希望每个不同的用户名都能创建一个包含该用户所有数据的列表。例如,我有一个arraylist(用户名,推文),其中包括:lefteris,“Plays ball”,Kostas,“Plays basketball”,lefteris,“Nice weather”。我想在那之后创建两个列表。一个列表包含kostas和他的推文,另一个列表包含lefteris及其推文(2条推文)。父级arraylist可能有20个不同的用户名或更多。我怎么能这样做?

4 个答案:

答案 0 :(得分:0)

我建议您使用hashmap或hashset,因为如果您需要成对存储,哈希是一个完美的解决方案......

答案 1 :(得分:0)

我会使用以下数据结构:

HashMap<String, ArrayList<String>>

然后,如果属性是单个项目,您可以操作键入每个名称的“动态”属性列表:

Lefteris->("Plays ball", "Nice weather",...)
Kostas->("Plays basketball",...)

如果属性是键值对,请执行:

HashMap<String, HashMap<String, Object>>

数据看起来像:

Lefteris->(Sport->"Plays ball", Weather->"Nice",...)
Kostas->(Sport->"basketball",...)

答案 2 :(得分:0)

由于您从文件中解析项目,因此可以执行以下操作。

创建包含与特定用户名相关联的推文的地图

Map<String,List<String>> userTweets = new HashMap<String,List<String>>();

然后,有一种方法可以将推文与特定用户相关联,验证它是否已添加到地图中,如果不是,则添加它。

public void addTweetToUser(String user, String tweet) {
    if(userTweets.containsKey(user))
        userTweets.get(user).add(tweet);
    else {
        List<String> newUserTweets = new LinkedList<String>();
        newUserTweets.add(tweet);
        userTweets.put(user, newUserTweets);
    }
}

作为一个优点,您可以通过创建包含以下内容的对象UserTweet来改善这一点。

public class UserTweet {
    private String user;
    private String tweet;

    //Constructor, Setters & Getters or all of them
}

然后,您的addTweetToUser方法可以改为使用UserTweet参数。

如果您想知道特定用户的推文,只需从userTweets地图获取相应的列表即可。我也会删除推文和/或删除用户,以防万一。

答案 3 :(得分:0)

多个库根据功能语言提供的功能为Java添加了出色的集合处理功能。一个这样的库是Google Guava。 Guava提供MultiMap适合按照您想要的方式分组。还有许多实用方法,如MultiMaps.index(),它通过将一些函数应用于列表的元素来计算密钥,从列表中将项目收集到地图中。有了这样的支持,它只需要几行代码和一个Function实现(任何其他语言中的closure)来解决您的问题:

import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multimaps;

import java.util.Arrays;
import java.util.List;

public class Tweets {
    public static final int NAME = 0;
    public static final int TWEET = 1;

    public static void main(String[] args) {
        List<String> namesAndTweets = Arrays.asList(
            "lefteris", "Plays ball", 
            "Kostas", "Plays basketball", 
            "lefteris", "Nice weather");
        List<List<String>> nameTweetPairs = 
            Lists.partition(namesAndTweets, 2);
        Multimap<String, List<String>> namesAndTweetsByName =
            Multimaps.index(nameTweetPairs, get(NAME));
        Multimap<String, String> tweetsByName =
            Multimaps.transformValues(namesAndTweetsByName, get(TWEET));
        System.out.println(tweetsByName);
    }

    private static Function<List<String>, String> get(final int n) {
        return new Function<List<String>, String>() {
            @Override
            public String apply(List<String> nameAndTweet) {
                return nameAndTweet.get(n);
            }
        };
    }
}

输出:

{lefteris=[Plays ball, Nice weather], Kostas=[Plays basketball]}

更新:为了更详细地解释一下代码,有三个基本步骤:

  1. 将名称和推文全部混合在一起的列表中使用Lists.partition()将其分成对(名称,推文)。
  2. 使用MultiMaps.index()从对中构建MultiMap,将名称作为地图键。这为您提供了一个地图,其中地图键是名称,地图值是(名称,推文)对。
  3. 使用MultiMaps.transformValues()将地图值从(名称,推文)对减少到推文。
  4. P.S。有没有人知道是否有一个内置函数可以执行get()所做的事情?它似乎是一个应该提供的有用函数,但我无法在任何地方找到它。

相关问题