Java ArrayList仅添加一个元素

Java ArrayList仅添加一个元素,java,Java,在我的主要方法中: 类AbstractListMM public abstract class AbstractListMM<K,V> implements IMiniMap<K,V>{ protected List <K> keys; protected List <V> vals; // Initialize the lists of keys and values with a concrete instance pub

在我的主要方法中:

类AbstractListMM

public abstract class AbstractListMM<K,V> implements IMiniMap<K,V>{

    protected List <K> keys; 
    protected List <V> vals;

// Initialize the lists of keys and values with a concrete instance
public AbstractListMM()
{
    this.keys = new ArrayList<K>();
    this.vals = new ArrayList<V>();
}
public AbstractListMM(List <K> keys, List <V> vals)
{
    this.keys = keys;
    this.vals = vals;
}

// Return the number of bindings based on the size of the key list
public int size()
{
    return keys.size();
}
public List<K> keys()
{
     List<K> newKeys = this.keys;
     return newKeys;
} 
public abstract V put(K key, V value);

}
}

在你的put方法中,我觉得有两件事很奇怪。首先,在插入的周围有一个if语句,ifkeys.size==0,这就是为什么只有该方法的第一个调用实际上在向列表中添加某些内容。在第二次调用中,列表大小不再为0,并且不会添加任何内容

在put方法的返回中,您也将整个列表强制转换为一个类型为V的单个对象,但实际上它是一个列表。老实说,我不知道为什么你的方法会返回任何东西,但也许你的代码中有一些奇怪的java东西或概念,我不知道

无论是哪种方式,如果你删除或改变,如果条件,它应该解决你的问题,因为我理解它。也许你想在后面加一个else子句

if(keys.size() == 0)
{
    keys.add(key);
    vals.add(value);
}
for(...)
变成:

if(keys.size() == 0)
{
    keys.add(key);
    vals.add(value);
}
else
{
    for(...)

我认为这更符合您的意图:

您只在keys ArrayList中添加一个元素,当该元素开始时为空。 像这样的方法应该会奏效:


在我看来,有两种选择。 1.该键存在于列表中。找到键并更新值。 2.该键在列表中不存在,必须添加到列表中

if(keys.contains(key)) {
    vals.set(keys.indexOf(key), value);
} else {
   keys.add(key);
   values.add(value);
}
如上所述,由于大小检查,函数put在第一次put后从不设置任何值

但是,当您向映射中添加一个时,for循环只检查重复的键,而不检查将在何处设置VAL。可能不需要检查keys.size==0,因为即使使用else循环,也不会添加该值

为了避免重复键,一种方法是

if(keys != null)
{
    if(keys.contains(key))
    {
       vals.set(keys.indexOf(key), value);
    }
    else
    {
       keys.add(key);
       vals.add(value);
    }
}
else
{
    keys = new ArrayList<K>();
       keys.add(key);
       vals.add(value);
}

在put方法中取消对else语句的注释。@ChristofferPasser,如果我取消对它的注释,结果恰好是32Ah。。那个支票不应该在foor循环中。我建议你在循环前检查一下。检查密钥是否在密钥列表中。如果是-运行for循环。否则添加它。@ChristofferPasser,你说检查不应该在for循环中是什么意思?我已经发布了一个答案来说明我的意思:-当你尝试它时会发生什么?它仍然只添加了一项?
boolean found = false;
for(int i = 0; i < keys.size(); i++) {
    if(keys.get(i).equals(key)) {
        vals.set(i, value);
        found = true;
        break;        
    }
if (!found) {
    keys.add(key);
    vals.add(value);
}
if(keys.contains(key)) {
    vals.set(keys.indexOf(key), value);
} else {
   keys.add(key);
   values.add(value);
}
if(keys != null)
{
    if(keys.contains(key))
    {
       vals.set(keys.indexOf(key), value);
    }
    else
    {
       keys.add(key);
       vals.add(value);
    }
}
else
{
    keys = new ArrayList<K>();
       keys.add(key);
       vals.add(value);
}