代码之家  ›  专栏  ›  技术社区  ›  Adam

如何使用递增键为重复项创建唯一标签?

  •  0
  • Adam  · 技术社区  · 16 年前

    这是Java环境下的编程技术问题。

    问题:我们有所有需要唯一的字符串键。集合的实现是map和arraylist的组合,它允许将集合用作map或arraylist(如果您感兴趣,可以使用jfreechart的defaultpiedataset)。如果我们有一个数据块,我们希望它本身就是关键。如果我们有用其他键分隔的倍数,我们需要数据加上一个分隔符和一个递增的数字。

    例如:

    有两个的数据 Bob 条目,然后是 Albert 想要钥匙吗 ["Bob", "Albert"] .

    数据看起来像 艾伯特 鲍勃 用两 鲍勃 条目与 艾伯特 中间有钥匙 ["Bob : 1", "Albert", "Bob : 2"] .

    这是我们迄今为止的准则:

    String dataKey = "";
    DefaultPieDataset ringDataset = new DefaultPieDataset();
    for(String thisData: dataList)
    {
        int dataValue;
        if(dataKey.equals(thisData))
        {
            dataValue= ringDataset.getValue(dataKey).intValue() + 1;
        }else
        {
            dataKey= thisData;
            if(ringDataset.getKeys().contains(dataKey) || ringDataset.getKeys().contains(dataKey+ " : 1")) //has this name been represented already?
            {
                if(ringDataset.getKeys().contains(dataKey)) //do we need to change the name to accommodate multiples?
                {
                    int existingKeyIndex = ringDataset.getIndex(dataKey);
                    int existingKeyValue = ringDataset.getValue(dataKey).intValue();
                    ringDataset.remove(dataKey);
                    ringDataset.insertValue(existingKeyIndex, dataKey+ " : 1", existingKeyValue);
                }
    
                int counter = 2;
                do{
                    dataKey= thisData + " : " + counter;
                    counter ++;
                }while(ringDataset.getKeys().contains(dataKey)); //ensure that we are using a new key
            }
            dataValue= 1;
      }
     ringDataset.setValue(dataKey, dataValue);
    }
    

    目前,代码会针对每个副本附加“:”,以便取代 Bob : 2 它使 Bob : 1 : 2

    另外一个挑战是,我不能保证名称没有分隔符(示例中的冒号)。

    此外,对于任何添加的库都需要大量繁琐的繁琐程序,因此只需要一个Java API解决方案。

    谢谢你帮我做这个特别的脑筋扭动手术,
    亚当

    编辑:为了进一步澄清代码,items值基于数据类型在一行中出现的次数。所以在第一个例子中, 鲍勃 值为2且 艾伯特 1.在第二个示例中,所有键的值都为1。

    1 回复  |  直到 16 年前
        1
  •  0
  •   Oscar Chan    16 年前

    我假设您不必处理分布式系统的唯一性,因为您的问题在客户端。另外,我假设您不必在多个线程上处理同步。如果没有,可以考虑将synchronized关键字放在incrementalLabelCount()方法中,并且性能可能还可以。

    我将把你的代码分成两部分,这样更容易管理:
    -第1部分:跟踪已知标签 -第2部分:生成唯一标签

    下面是我快速键入的代码(没有编译逻辑)

    class KnownLabels
    {
      Map<String, Integer> currentCountsByLabel;
    
      public int incrementLabelCount(String label)
      {
        Integer count = currentCountsByLabel.get(label);
        if(count==null)
          count = 1;
        else
          count += 1;
    
        currentCountsByLabel.put(label, count);
    
        return count;
      }
    }
    
    class UniqueLabelGenerator
    {
      private KnownLabels knownLabels = new KnownLabels();
    
      public String getUniqueLabel(String label)
      {
        int i = knownLabels.incrementLabelCount(label);
    
        if(i>1)
          return label + ":" + i;
    
         return label;
      }
    }