0

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

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

例如:

具有两个Bob条目然后是 an 的数据Albert将具有["Bob", "Albert"].

看起来像Albert并且Bob具有两个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 : 2Bob : 1 : 2

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

此外,添加任何库都需要大量繁文缛节,因此需要一个仅 Java API 的解决方案。

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

编辑:为了进一步澄清代码,项目值基于数据类型连续出现的次数。所以在第一个例子中,键Bob的值是 2 和Albert1。在第二个例子中,所有键的值都是 1。

4

1 回答 1

0

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

我会将您的代码分成两部分,因此更易于管理:
- 第 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;
  }
}
于 2009-08-26T18:30:47.537 回答