对arrayList感到困惑

时间:2013-06-15 08:32:32

标签: java

当我向老师请求帮助时,我得到了这行代码,但是在最后一部分下面我得到了一条红线。可能有什么不对?错误消息:“表达式的类型必须是数组类型,但它已解析为ArrayList”我不明白,请帮助我理解。

ArrayList<Point>[] touchPoints = new ArrayList<Point>()[2];

我想要两个名单来保存积分。我想我会将每个列表称为touchPoints[0];touchPoints[1];!?

编辑:

我想我可以保持简单,只需使用两个不同的List!?:

points1 = new ArrayList<Point>();
points2 = new ArrayList<Point>();

3 个答案:

答案 0 :(得分:2)

您已经创建了一个ArrayLists数组。该演示展示了它们如何一起使用

import java.util.ArrayList;

public class ArraysAndLists {
    public static void main(String[] args) {
        ArrayList<String>[] touchPoints = new ArrayList[2];

        // Adding values
        touchPoints[0] = new ArrayList<String>();
        touchPoints[0].add("one string in the first ArrayList");
        touchPoints[0].add("another string in the first ArrayList");

        touchPoints[1] = new ArrayList<String>();
        touchPoints[1].add("one string in the second ArrayList");
        touchPoints[1].add("another string in the second ArrayList");

        // touchPoints[2].add("This will give out of bounds, the array only holds two lists");

        // Reading values
        System.out.println(touchPoints[0].get(0)); // returns "one string in the first ArrayList"
        System.out.println(touchPoints[1].get(1)); // returns "another string in the second ArrayList"

    }
}

答案 1 :(得分:1)

查看此Question

  

数组对象的组件类型可能不是类型变量或参数化类型,除非它是(无界)通配符类型。您可以声明其元素类型是类型变量或参数化类型的数组类型,但不能数组对象。

答案 2 :(得分:1)

你混合了两件事:

  • 构建一个普通数组
  • 构建ArrayList

构造数组

普通数组的级别非常低。没有方法,并且在创建它之后它的长度是固定的。

MyType[] anArray = new MyType[10]; 

构造ArrayList

ArrayList只是一种Collection

的实现
Collection<MyItemType> aCollection = new ArrayList<MyItemType>();

你的案子怎么办?

您需要一个简单的集合数组(其实现是ArrayList)。所以:

// Create the array, use the interface in case you need to change the implementation later on
Collection<Point>[] touchPoints = (Collection<Point>) new Collection[2];

// Create each collection within that array, using the ArrayList implementation
touchPoints[0] = new ArrayList<Point>();
touchPoints[1] = new ArrayList<Point>();

如何做得更好?

尝试思考为什么需要普通数组:

  • 如果它只是2个元素,并且总是固定的,只需创建两个成员变量。
  • 如果数字可以变化,只需创建一个集合集合(集合&gt;)

根据您的用例进行编辑:

只需创建一个类来保存用户输入:

class UserInput {

  public UserInput() {
    user1TouchPoints = new ArrayList<Point>();
    user2TouchPoints = new ArrayList<Point>();
  }

  // Add accessors and all

  private Collection<Point> user1TouchPoints;
  private Collection<Point> user2TouchPoints;
}

如果您打算有更多玩家,只需使用地图

class UserInput {

  public UserInput() {
    usersTouchPoints = new HashMap<Integer, Collection<Point>>();
  }

  public Collection<Point> getUserTouchPoints(Integer userId) {
    return usersTouchPoints.get(userId);
  }

  public void addUserTouchPoints(Integer userId, Collection<Point> input) {
    Collection<Point> points = usersTouchPoints.get(userId);
    if (points==null) {
      points = new ArrayList<Point>();
      userTouchPoints.put(userId, points);
    }
    points.addAll(input);
  }

  // Maps a user ID (or index) to its touch points
  // If you are using Android, use SparseArray instead of Map, this is more efficient
  private Map<Integer, Collection<Point>> usersTouchPoints;
}