说我有以下类(class):

public class Tagged {

    private List<String> tags;
}

public class ContainerOfTagged {

    private List<Tagged> tagged;
}

通过这种结构,每当我需要查找带有特定标签的Tagged时,都需要遍历ContainerOfTagged中的所有标签,并遍历每个Tagged的所有标签。这可能会影响性能,具体取决于列表的大小。

一个简单的解决方案是将ContainerOfTagged类更改为使用Map,在Tagged列表中映射标签:
public class ContainerOfTagged {

    private Map<String, List<Tagged>> tagMapping;
}

现在,我需要做的就是提供一个标签,Map将返回带有所述标签的所有Tagged。但是,这样做会导致数据重复,因为TaggedContainerOfTagged类中都存在相同的标记。

因此,有没有办法使用不重复数据的高性能解决方案来解决此问题?

最佳答案

您不能真正避免“复制”标签,但是请记住您并没有真正复制它们,因为“列表”和“ map ”仅存储对标签字符串的引用,而不是值的存储(但是,引用可能会占用很多时间)本身的空间)。

问题是您需要两个索引:

  • 给定Tagged对象,您需要找到标签列表。
  • 您需要找到带有标签的Tagged对象。

  • 理想情况下,您的解决方案应如下所示。您可以通过一种方法来管理标记,从而解决对不同步问题的担忧。

    请注意,在Tagged中,应使用Set而不是列表,以避免标签重复。
    public class Tagged {
        Set<String> tags;
    }
    
    public class TagContainer {
        Map<String, Tagged> tagIndex;
    
        public tag(String tag, Tagged tagged) {
            tagged.tags.add(tag);
            tagIndex.put(tag, tagged);
        }
    

    如果内存利用率是主要问题,则可以尝试某种引用压缩。使用此技术,您可以将标签存储在数组中,然后按索引引用它们。如果数量不足,则可以使用字节或短字节代替引用,但是代码会更加困惑,我不建议这样做。

    编辑:

    在我的第一篇文章中,我建议Tagged应该是一个称为Tagable的接口(interface)。这样比较干净,但是延长了解决方案的时间,所以我回到了一个类。但是,您也许可以考虑具有Tagable接口(interface),并在Tagged类中实现此接口(interface)。
    public interface Tagable {
        Set<String> getTags;
        tag(String tag);
    }
    

    关于java - 性能结构,无数据重复,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39193358/

    10-10 14:28