- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否存在可以在现有键上添加别名的映射实现
SuperMap map = .....;
map.put("key1" , object1);
map.addAlias("key1" , "aliaskey"); // <== create alias
Object o = map.get("aliaskey"); // equals object1
谢谢
最佳答案
不确定你想用它做什么,或者它是否值得麻烦,但到目前为止我在这个线程中看到的实现都存在别名与它作为别名的 key 断开连接的问题。例如,如果您说:
SuperMap<String, String> sm = new SuperMap<String, String>();
sm.put("Elvis", "Presley");
sm.addAlias("Priscilla", "Elvis");
System.out.println(sm.get("Elvis"));
System.out.println(sm.get("Priscilla"));
sm.put("Elvis", "Costello");
System.out.println(sm.get("Elvis"));
System.out.println(sm.get("Priscilla"));
你会得到:
Presley
Presley
Costello
Presley
(注意:这是 SuperMap 的原始实现,而不是编辑后的版本。)
如果你想要一个真正的别名——如果你想得到 Presley, Presley, Costello, Costello
——你将需要一些更复杂的东西。
下面的代码未经测试(整个企业看起来有点疯狂),但类似的东西应该可以工作:
public class AliasMap<K, V> extends AbstractMap<K, V>
{
private final Map<K, V> backingMap;
private final Map<K, K> aliasToRealKey;
public AliasMap ()
{
this( new HashMap<K, V>() );
}
public AliasMap ( Map<K, V> backingMap )
{
this.backingMap = backingMap;
aliasToRealKey = new HashMap<K, K>();
}
@Override
public Set<Entry<K, V>> entrySet ()
{
return new AliasAwareEntrySet<K, V>( aliasToRealKey, backingMap );
}
@Override
public V put ( K k, V v )
{
if ( aliasToRealKey.containsKey( k ) )
{
throw new IllegalArgumentException( "An alias '" + k + "' already exists in the map" );
}
return backingMap.put( k, v );
}
@Override
public V get ( Object o )
{
V v = backingMap.get( o );
if ( v == null )
{
K realKey = aliasToRealKey.get( o );
if ( realKey == null )
{
return null;
}
return backingMap.get( realKey );
}
return v;
}
public void alias ( K realKey, K alias )
{
if ( backingMap.containsKey( alias ) )
{
throw new IllegalArgumentException( "The key '" + alias + "' already exists in the map" );
}
aliasToRealKey.put( alias, realKey );
}
private static class AliasAwareEntrySet<K, V> extends AbstractSet<Entry<K, V>>
{
private Map<K, K> aliasToRealKey;
private Map<K, V> backingMap;
public AliasAwareEntrySet ( Map<K, K> aliasToRealKey, final Map<K, V> backingMap )
{
this.aliasToRealKey = aliasToRealKey;
this.backingMap = backingMap;
}
@Override
public Iterator<Entry<K, V>> iterator ()
{
return new AliasAwareEntryIterator<K, V>( backingMap, aliasToRealKey );
}
@Override
public int size ()
{
return backingMap.size() + aliasToRealKey.size();
}
}
private static class AliasAwareEntryIterator<K, V> implements Iterator<Entry<K, V>>
{
Set<Entry<K, V>> realEntries;
Set<K> aliasKeys;
Iterator<Entry<K, V>> realIterator;
Iterator<K> aliasIterator;
boolean isRealEntry = true;
private Map<K, V> backingMap;
private Map<K, K> aliasToRealKey;
public AliasAwareEntryIterator ( final Map<K, V> backingMap, Map<K, K> aliasToRealKey )
{
this.realEntries = backingMap.entrySet();
this.aliasKeys = aliasToRealKey.keySet();
realIterator = realEntries.iterator();
aliasIterator = aliasKeys.iterator();
this.backingMap = backingMap;
this.aliasToRealKey = aliasToRealKey;
}
public boolean hasNext ()
{
return realIterator.hasNext() || aliasIterator.hasNext();
}
public Entry<K, V> next ()
{
if ( realIterator.hasNext() )
{
return realIterator.next();
}
isRealEntry = false;
final K alias = aliasIterator.next();
final K realKey = aliasToRealKey.get( alias );
return new AliasAwareEntry( alias, realKey );
}
public void remove ()
{
if ( isRealEntry )
{
realIterator.remove();
}
else
{
aliasIterator.remove();
}
}
private class AliasAwareEntry implements Entry<K, V>
{
private final K alias;
private final K realKey;
public AliasAwareEntry ( K alias, K realKey )
{
this.alias = alias;
this.realKey = realKey;
}
public K getKey ()
{
return alias;
}
public V getValue ()
{
return backingMap.get( realKey );
}
public V setValue ( V v )
{
return backingMap.put( realKey, v );
}
}
}
public static void main ( String[] args )
{
AliasMap<String, String> sm = new AliasMap<String, String>();
sm.put( "Elvis", "Presley" );
sm.alias( "Elvis", "Priscilla" );
System.out.println( sm.get( "Elvis" ) );
System.out.println( sm.get( "Priscilla" ) );
sm.put( "Elvis", "Costello" );
System.out.println( sm.get( "Elvis" ) );
System.out.println( sm.get( "Priscilla" ) );
for ( String s : sm.keySet() )
{
System.out.println(s);
}
for ( Iterator<Entry<String, String>> iterator = sm.entrySet().iterator(); iterator.hasNext(); )
{
Entry<String, String> entry = iterator.next();
System.out.println( entry.getKey() + " : " + entry.getValue() );
if ( "Priscilla".equals( entry.getKey() ) )
{
iterator.remove();
}
}
for ( String s : sm.keySet() )
{
System.out.println(s);
}
}
}
关于Java map : alias on key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15486884/
我会在 Cmder 的另一个别名中使用别名。 我有一个很好的别名(第一个)到一个大命令,我会在另一个(第二个)中使用它: mergelocdist=git fetch origin --prune -
我正在尝试让 cgi 在我的本地主机服务器上工作。 首先我添加了虚拟本地主机。 我有 conf 文件/etc/apache2/sites-available/myage.com.conf这是这个文件的
有什么区别: 从'utils'导入utils 和 从“utils”导入 * 作为 utils? 情况 A: //utils.js export function doSomething() { //.
我用 MySQL 试过这个: DELETE FROM `contact_hostcommands_relation` AS `ContactHostCommand` WHERE (`ContactHo
我正在为一个学校项目使用 NodeJS 和 Sequelize,我正在努力与 sequelize 工作建立联系。我之前尝试过一些东西,但没有一个让我开心。 基本上,一个用户可以拥有多个播放列表 (ha
除了 Set-Alias能够更改现存的别名,这些命令之间有什么区别? 为什么会有人用New-Alias在 Set-Alias ? 最佳答案 使用 new-alias 的一个(唯一的?)优势是当您覆盖现
假设 bash 配置了以下别名: alias up="git --git-dir /path/to/backup/.git" 那个特定的存储库 - 并且只有那个存储库 - 具有以下 git 别名: [
我的Sql查询是 Select a.sum_total FROM OneWayNetTransactionRes a LEFT OUTER JOIN OneWayNetTransactionRes b
我可能以错误的方式寻找这个,但有一件事我不明白: select max(dateofbirth) -5 from person; 因此,上面的示例为我提供了任何人的最大日期减去 5 天,正如我所期望的
我有一个 Lambda,它有许多版本,并为每个版本创建了别名。这是一个例子 Apple_Version_1 Apple_Version_1.1 Apple_Version_1.2 Apple_Vers
我使用 win32com 库在本地获取邮件,但现在我使用 Exchangelib 来执行相同的操作,但我找不到与此等效的函数(item.sender.getExchangerUser().Alias)
在我的 .bashrc 文件中,我放入了以下两行: alias foo1="echo $1" alias foo2="echo '$1'" 然后,在终端中,我得到以下输出: $ foo1 hello
只要代码有更新,我就会发布新版本,并为该版本创建别名。但以前的别名在新版本中消失了 这是我的 YAML 模板片段 Description: Publish a new version of a
在我的 Django 项目中,我试图将数据库字段从 OneToOne 更改为foreignKey。当我运行“python manage.py migrate”时,它会因一个长回溯而中断,并以我在标题中
我有一个关于记录的问题:假设我有一个接收记录的函数,如下所示: getId : { file | id : String } -> String getId file = file.id 我可以传递这
我写了这样的语法: grammar StatementFormat { token TOP { ( | '%' )* } token plain { } token plac
这个问题在这里已经有了答案: Creating permanent executable aliases (4 个回答) 8年前关闭。 例如,如果您创建别名: alias cls="clear" 它存
我在我的 iPhone 应用程序中查看一些动画,感觉它有点难看。然后我明白了:它只是不通过子像素状态进行动画处理。 所以,如果我使用通常的+beginAnimations/+commitAnimati
在Elastic / Elasticsearch网站上的Faking Index per User article中,建议对多个(数千个)客户端使用单个索引,并使用过滤器别名以不可见的方式分离其数据。
这可能是一个无聊的问题,但我无法找到我完全理解以下查询的答案。 我搬到了一个新的研究所,我正在访问虚拟机进行研究。我想创建一个方便的 bashrc 让生活更轻松。 因此,使用以下内容编辑 ~/.bas
我是一名优秀的程序员,十分优秀!