所以我做一个项目,并得到了五个不同的类别:
public class Article { ... }
public class Shirt extends Article { ... }
public class Boots extends Article { ... }
...
我可以做类似的事情
public enum Articletype {
Shirt, Boots, ...
}
和在地图等使用这些枚举
Map<Integer,Articletype> testMap = new HashMap<Integer,Articletype>();
我该如何处理?
我已经有了一张地图,该地图保存了“衬衫”-这样的对象
Map<Integer,Shirt> shirts = new HashMap<>()
我尝试过类似的
Map<Integer,Articletype> testMap = new HashMap<Integer,Articletype>();
testMap.put(1,shirts.get(1001));
但这不起作用。我不认为我完全理解这些枚举类型,但我知道您可以像这样使用它们(或者我错了吗?)。
反正我有种想更经常利用他们,我希望有人能带来一些光这黑暗之中。
答案 0 :(得分:0)
您可以使用类似的枚举-这意味着您基本上用更具表现力的enum
IIUC替换了当前的int表示类型,但是请注意,这样做确实存在缺点,即添加新文章类型时灵活性较差。这真的是一个问题,在这种情况下使用它是否是个好主意。
然后您可以做的是维护一个Map<ArticleType, List<Article>>
,其中将包含给定类型的所有文章,例如
List<Article> allArticles = ...
Map<ArticleType, List<Article>> grouped = new HashMap<ArticleType,List<Article>>();
for (Article a : allArticles) {
List<Article> ofType = grouped.computeIfAbsent(a.getArticleType(), ArrayList::new);
ofType.add(a);
}
// and then you get all shirts by
List<Article> shirts = grouped.get(ArticleType.Shirt);
请注意,在Java 8中,使用流可以更短地完成
Map<ArticleType,List<Article>> bytype = allArticles.stream()
.collect(Collectors.groupBy(Article::getType));
答案 1 :(得分:0)
在您的testMap
上下文中没有枚举的位置。您要在地图中存储的对象是扩展了Article
的类型的对象。使用Map<Integer, Articletype>
没有什么意义,因为您不是将文章类型映射为整数,而是将文章映射为整数。
例如,如果必须按类型对所有文章进行分组,那么使用枚举将是有效的情况。
Map<ArticleType, List<? extends Article>> articlesByType = new HashMap<>();
List<Boot> bootList = ...
articlesByType.put(ArticleType.BOOT, bootList);