【发布时间】:2009-08-26 17:54:09
【问题描述】:
这是Java上下文中的编程技术问题。
问题:我们的字符串键都必须是唯一的。集合的实现是 Map 和 ArrayList 的组合,它允许将集合用作 Map 或 ArrayList(如果您好奇,可以使用 JFreeChart 的 DefaultPieDataset)。如果我们有一条数据,我们希望它是关键本身。如果我们有多个被其他键分隔的倍数,我们需要数据加上一个分隔符和一个递增的数字。
例如:
具有两个Bob 条目和一个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 : 2,而是生成Bob : 1 : 2
另一个挑战是我不能保证该名称不会有分隔符(示例中的冒号)。
此外,任何添加的库都需要大量繁文缛节,因此需要仅 Java API 的解决方案。
感谢您对这个特别的脑筋急转弯的帮助,
亚当
编辑:为了进一步阐明代码,项目值基于该数据类型连续出现的次数。因此,在第一个示例中,键 Bob 的值为 2,Albert 为 1。在第二个示例中,所有键的值为 1。
【问题讨论】:
标签: java unique-key