想象一下,我們正在提取關於人們和他們最喜歡的食物的數據。
數據會到我們這裏來的格式爲: 「姓名,FavFood ,FavFood ..FavFood ñ」。
例如「詹姆斯,豆,雞」。
注意我們不知道一個人會喜歡多少食物。
從這個數據我們創建了一個人對象捕捉人的名字和喜歡的食物的一個實例。
我們拉着每個人的數據後,我們要創建一個電子表格,它的列是:Name|Potato|Chicken|Beans|Curry
等
所有數值以該人的姓名權的將是代表該食品是否是一個簡單的布爾值該人的最愛。
的問題是:我們不知道提前;所有人都可能喜歡的食物,因此不能只在類Person中設置布爾實例變量。
我考慮了一些思考,實施套,散套和散列地圖,但是每一個解決方案,我認爲最終被可怕不雅,所以我已經轉向了計算器的天才在這一個幫助。
我的問題是:我可以用什麼設計模式/方法來乾淨地實現我期望的結果?
雖然這是一個語言不可知的問題,但我正在用Java進行編程,所以如果在Java API或其他地方爲此編寫了任何東西,請告訴我。
在此先感謝!創建實時布爾值列表
回答
試試這個。它以csv形式生成數據。
class Person {
final String name;
final Set<String> foods;
Person(String name, Set<String> foods) {
this.name = name;
this.foods = foods;
}
Stream<Boolean> getBooleans(List<String> foods) {
return foods.stream().map(food -> this.foods.contains(food));
}
@Override
public String toString() {
return "Person(" + name + ", " + foods +")";
}
}
class Test {
public static void main(String[] args) throws Exception {
List<String> data = Arrays.asList(
"James, Beans, Chicken",
"Emily, Potato, Curry",
"Clara, Beans, Curry"
);
List<String> foodNames = Arrays.asList(
"Potato", "Chicken", "Beans", "Curry"
);
Stream<Person> persons = data.stream().map(d -> {
String[] split = d.split(",");
for(int i = 0; i < split.length; i++) {
split[i] = split[i].trim();
}
String name = split[0];
Set<String> foods = Stream.of(split).skip(1).collect(Collectors.toSet());
return new Person(name, foods);
});
Stream<String> csvData = persons.map(p ->
p.name + ", " + p.getBooleans(foodNames)
.map(b -> b.toString())
.collect(Collectors.joining(", "))
);
csvData.forEach(System.out::println);
}
}
感謝您的回答。這看起來有希望;我需要了解Streams。你介意檢查csvData的分配嗎?它提出了一個錯誤標誌,堅持「}」並沒有幫助哈。 – quantum285
*粘在大括號中 – quantum285
對不起,有一個';'丟失 – SpiderPig
這個僞代碼有什麼不雅之處?
Set<String> allFoods = new TreeSet<String>();
List<Person> allPersons = new ArrayList<Person>();
while (hasMorePersons()) {
Person person = getNextPerson();
allPersons.add(person);
allFoods.addAll(person.getFoods());
}
spreadSheet.writeHeader("Name", allFoods);
for (Person person : allPersons) {
spreadSheet.writeName(person.getName());
for (String food : allFoods) {
// assume getFoods() return a Set<String>,
// not necessarily ordered (could be a HashSet)
boolean yourBooleanHere = person.getFoods().contains(food);
spreadSheet.writeBoolean(yourBooleanHere);
}
spreadSheet.nextLine();
}
如果您需要一個布爾表或任何其他表,您可以在第二個循環期間輕鬆地將它們存儲在任何地方。
注:按自然順序TreeSet的訂單食品(即,按字母順序)。要按照遇到的順序輸出它們,請改爲使用LinkedHashSet
。
只是爲了澄清:我從來沒有說過HashMaps/HashSets不雅,任何使用它們的解決方案都不是。我說**我的**解決方案不夠優雅。這就是說,這真棒,正是我所需要的,非常感謝! – quantum285
首先,我強烈建議不管你在單獨的類中使用addFavoriteFood(String food)和boolean isFavoriteFood(String food)getFavorites(String food)來做它。
就我個人而言,我認爲這個類的實現應該包含一個實例HashSet(用於保存此人喜歡的食物)以及一個對所有可以包含所有食物列表的食物都通用的SortedSet。 (見尾註)
添加將其添加到兩套,getFavorites將返回那些在第一哈希集合。
嗯,可能還需要一個靜態getAllFavorites()方法返回的SortedSet
由於您FavoiteFoods類知道主列表和人的最愛,你甚至可以把它做的大部分工作由具有getFormattedRow()和靜態getFormattedHeaderRow()方法。那麼你的implementaiton就是:
System.out.println(FavoriteFoods.getFormattedHeaderRow());
for(Person person:people)
System.out.println(person.favoriteFood.getFormattedRow());
同樣,這裏的最好的事情是,你可以用最簡單的事情可能可能你的執行情況和工作以後再這樣做,如果需要的話,因爲,在另一個被孤立它不會感染所有代碼,並且不會執行具體的實現特定的集合,類,布爾等等。
有關主列表的注意事項:這個主列表可能天真地實現爲Static,但這是一個糟糕的主意 - 優化地將相同的masterList SortedSet傳遞給構造中的每個實例。另外,由於它在所有實例之間共享,並且可變,所以如果您的解決方案是線程化的,它會帶來問題!
我不同意這種'static'的用法。我寧願在人員列表的頂部添加另一個包含類,或者甚至可以從一些現有集合中擴展,重寫'add()'。但靜態是全球性的,因此通常是不好的。 –
我同意。主列表應該可以在創建時傳遞給每個食物列表,但似乎給已經變得太長的答案增加了更多的複雜性,我想簡化它。也許這是一個不好的主意 - 我可以將它添加爲答案的註釋。 –
- 1. 比較列表中的值並創建布爾值Python
- 2. 空列表布爾值
- 3. 如何創建布爾列表的布爾值取決於插入計數和列表f#
- 4. 創建VARCHAR列從布爾列的PostgreSQL
- 5. 從子列表創建布爾列表。 Python 2.7版
- 6. 如何創建布爾列並在創建/更改mysql表的列時分配值1?
- 7. 創建自定義布爾值?
- 8. 如何創建一個布爾值?
- 9. 軌布爾值重上創建
- 10. 防止多個asynctask實例或創建持久布爾值
- 11. 如何創建布爾列(WPF DevExpress Grid)
- 12. 爲布爾列創建索引
- 13. 布爾值列表的圖表
- 14. 爲。布爾的列表實現.all()?
- 15. 未創建布爾字段的實體表
- 16. 如何在布爾值上創建唯一約束2列?
- 17. R:創建總結布爾值的新列
- 18. 在MySQL中創建布爾列,默認值爲false?
- 19. 更新布爾值並同時創建新記錄 - Rails
- 20. 創建一個接受空值的布爾表單構件
- 21. 翻轉列表中的Python布爾值
- 22. Python中極大的布爾值列表
- 23. 用布爾值迭代python列表
- 24. 如何創建布爾?
- 25. 創建布爾面具
- 26. 如何創建一個返回布爾列表的sp?
- 27. 如何在mysql表中創建布爾列?
- 28. SQL語句來創建基於外國表的布爾列
- 29. 試圖在python中創建一個布爾列表
- 30. 創建共享點列表實例時添加html值
爲什麼'HashMap'是一個非常不雅的解決方案? –
使用套裝作爲所有食物,一組人的集合,你不喜歡什麼? 我會考慮讓數據本身(例如一組人,每個人都有自己喜歡的食物)以及數據的投影 - 它甚至不一定是數據類型,而只是一種映射機制將數據發送到您擁有的UI組件。 –
你有沒有嘗試過任何東西?它工作嗎?如果沒有,什麼不起作用?你有錯誤嗎? –