我遇到与“动态ArrayLists”相关的问题。我有一个包含用户名及其数据的列表。我希望每个不同的用户名都能创建一个包含该用户所有数据的列表。例如,我有一个arraylist(用户名,推文),其中包括:lefteris,“Plays ball”,Kostas,“Plays basketball”,lefteris,“Nice weather”。我想在那之后创建两个列表。一个列表包含kostas和他的推文,另一个列表包含lefteris及其推文(2条推文)。父级arraylist可能有20个不同的用户名或更多。我怎么能这样做?
答案 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]}
更新:为了更详细地解释一下代码,有三个基本步骤:
P.S。有没有人知道是否有一个内置函数可以执行get()
所做的事情?它似乎是一个应该提供的有用函数,但我无法在任何地方找到它。