【问题标题】:How to create a unique label with incrementing keys for duplicates?如何为重复项创建具有递增键的唯一标签?
【发布时间】:2009-08-26 17:54:09
【问题描述】:

这是Java上下文中的编程技术问题。

问题:我们的字符串键都必须是唯一的。集合的实现是 Map 和 ArrayList 的组合,它允许将集合用作 Map 或 ArrayList(如果您好奇,可以使用 JFreeChart 的 DefaultPieDataset)。如果我们有一条数据,我们希望它是关键本身。如果我们有多个被其他键分隔的倍数,我们需要数据加上一个分隔符和一个递增的数字。

例如:

具有两个Bob 条目和一个Albert 的数据将具有["Bob", "Albert"] 之类的键。

看起来像 AlbertBob 的数据有两个 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 的解决方案。

感谢您对这个特别的脑筋急转弯的帮助,
亚当

编辑:为了进一步阐明代码,项目值基于该数据类型连续出现的次数。因此,在第一个示例中,键 Bob 的值为 2,Albert 为 1。在第二个示例中,所有键的值为 1。

【问题讨论】:

    标签: java unique-key


    【解决方案1】:

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

    我会将您的代码分成两部分,这样更易​​于管理:
    - 第 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;
      }
    }
    

    【讨论】:

    • 我同意分解功能可能是一个好主意,因为这变得更加复杂。但是,另一个关键是需要在第二个标签出现时追溯更改标签的第一个实例。不过我喜欢你的想法,我会看看是否可以添加分隔符。
    猜你喜欢
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 2012-02-19
    • 1970-01-01
    • 2017-02-14
    相关资源
    最近更新 更多