ArrayList只添加一个元素

时间:2015-04-30 20:39:33

标签: java

在我的main方法中:

public class Tester {

    public static void main(String[] args)
    {
          IMiniMap<String,Integer> map = new SimpleListMM<String,Integer>();
            map.put("B",15);
            map.put("A",5);
            map.put("R",-5);
            map.put("D",55);
            map.put("Poems",128);
            map.put("Plays",256);

            System.out.println(map.size());
            System.out.println(map.keys());

    }
}

map调用put并在ArrayList中添加元素时,在我的方法中它只添加一个元素。当我致电map.size时,它只会回复1,当我致电map.keys时,它只返回"B"。这是代码: class SimpleListMM

    public class SimpleListMM<K,V> extends AbstractListMM<K,V> {
    public SimpleListMM()
        {
            super(new ArrayList<K>(), new ArrayList<V>());
        }
    public V put(K key, V value)
        {
            if(keys.size() == 0)
            {
                keys.add(key);
                vals.add(value);
            }
            for(int i = 0; i < keys.size(); i++)
            {
                if(keys.get(i).equals(key))
                    vals.set(i, value);
                /*else
                {
                    keys.add(key);
                    vals.add(value);
                }*/
            }
            return (V)vals;
        }
}

类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);

}
}

4 个答案:

答案 0 :(得分:0)

在你的put方法中,我看到两个对我来说很奇怪的东西。首先,你的插入周围有一个if语句,&#34; if(keys.size()== 0)&#34;这就是为什么只有方法的第一次调用实际上是在列表中添加一些内容。在第二次调用时,列表大小不再为0,并且不会添加任何内容。

在put方法的返回中,您还将整个列表作为V类型的单个对象进行投射,但实际上它是一个List。我不确定为什么你的方法返回任何东西都是诚实的,但也许有一些奇怪的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(...)

我认为这更符合你的意图:)

答案 1 :(得分:0)

您只在键ArrayList中添加一个元素,在它开始时为空。 这样的事情应该有效: .....

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);
}

答案 2 :(得分:0)

我认为,有两种选择。 1.密钥存在于列表中。找到密钥并更新值。 2.密钥不在列表中,必须添加到密钥中。

if(keys.contains(key)) {
    vals.set(keys.indexOf(key), value);
} else {
   keys.add(key);
   values.add(value);
}

答案 3 :(得分:0)

正如cbhedd所说,由于大小检查,函数put在第一次放置之后永远不会设置任何值。

但是当你向地图添加“A”时,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);
}