Java从Array创建多维数组

时间:2017-03-23 14:05:51

标签: java arrays multidimensional-array

我有一个数组@keyframes fade { 0% {opacity:1} 33.333% { opacity: 0} 66.666% { opacity: 0} 100% { opacity: 1} } ,其元素如下:

Object[]

我想从中创建一个多维数组,如:

Foo A
Foo B
Foo C
notFoo A
notFoo B
notFoo C

因此,如果此阵列中的元素中包含第一个令牌(例如Foo),则该名称在其存储在另一个行列之前不会出现。

所以第一个标记表示"元素套件",它导致数组中的另一个索引。

任何想法怎么做?

编辑:元素的类型为String。

2 个答案:

答案 0 :(得分:0)

您可以执行类似

的操作
Map<Object.class, List<Object>>

Map<identifier, List<entries>>

然后在添加到地图时,只检查Object.class是否在地图中存在,如果它确实获取列表并插入对象,则在地图中插入新的一个条目并将Object添加到列表中。请注意,此解决方案支持列表中的任何键和任何值类型,只要它不是基元(即使用基元的包装器)

<强>额外

使用数组意味着你从一开始就知道数组的长度,最好使用像List / Map这样的数据结构来解决没有定义Array / List长度的问题

指定为在评论中重新加入的实用工具类

此类包含一个私有地图,一种向地图添加值的方法,以及一种获取地图的方法,或地图的二维数组版本。

public class UtilClass {

    private Map<Object, List<Object>> map = new HashMap<>();

    public void addMapEntry(Object key, Object data){
        List<Object> list = new ArrayList<>();
        if(map.containsKey(key)) {
            list = map.get(key);
        }
        list.add(data);
        map.put(key, list);
    }

    public Object[][] getMapAs2dArray(){
        Object[][] array = new Object[map.keySet().size()][];
        int index = 0;
        for(Object key : map.keySet()){
            array[index] = map.get(key).toArray();
            index++;
        }
        return array;
    }

    public Map<Object, List<Object>> getMap() {
        return map;
    }
}

测试上面代码的主要方法

public static void main(String[] args){

    UtilClass test = new UtilClass();

    for(int i = 0; i < 10; i++){
        test.addMapEntry("foo", "foo"+i);
        test.addMapEntry("bar", "bar"+i);
    }

    for(Object key : test.getMap().keySet()){
        System.out.println("Printing map");
        System.out.println(key + " = " + test.getMap().get(key).toString());
    }

    Object[][] objects = test.getMapAs2dArray();

    System.out.println("printing 2d Array");
    System.out.println(Arrays.deepToString(objects));

    System.out.print("Done");
}

主要测试方法的输出如下

  

打印地图

     

bar = [bar0,bar1,bar2,bar3,bar4,bar5,bar6,bar7,bar8,bar9]

     

打印地图

     

foo = [foo0,foo1,foo2,foo3,foo4,foo5,foo6,foo7,foo8,foo9]

     

打印2d数组

     

[[bar0,bar1,bar2,bar3,bar4,bar5,bar6,bar7,bar8,bar9],[foo0,foo1,foo2,foo3,foo4,foo5,foo6,foo7,foo8,foo9]]

     

完成

UtilClass也可以静态定义为

public class UtilClass {

    public static void addMapEntry(Object key, Map<Object, List<Object>> map, Object data){
        List<Object> list = new ArrayList<>();
        if(map.containsKey(key)) {
            list = map.get(key);
        }
        list.add(data);
        map.put(key, list);
    }

    public static  Object[][] getMapAs2dArray(Map<Object, List<Object>> map){
        Object[][] array = new Object[map.keySet().size()][];
        int index = 0;
        for(Object key : map.keySet()){
            array[index] = map.get(key).toArray();
            index++;
        }
        return array;
    }
}

这使得可以在不实例化类的情况下访问功能,如果您不希望为包含数据的地图创建包装器,则可能会更好

答案 1 :(得分:0)

这可能是一种极端矫枉过正的事情,但作为一个例子仍然会很有趣:

public static <T> Map<Class<?>, List<T>> splitValues(T[] objects)
{
    Map<Class<?>, List<T>> values = new HashMap<>();

    for (T object : objects)
    {
        List<T> list = values.computeIfAbsent(object.getClass(), k -> new ArrayList<>());
        list.add(object);
    }

    return values;
}

public static void main(String[] args)
{
    Object[] objects = {
        new Foo(),
        new Foo(),
        new Foo(),
        new Foo(),
        new Integer(6),
        new Integer(4),
        new String("bla1"),
        new String("bla2"),
    };
    Map<Class<?>, List<Object>> map = splitValues(objects);

    System.out.println(map.get(Foo.class).toString());
    System.out.println(map.get(Integer.class).toString());
    System.out.println(map.get(String.class).toString());

    // [org.stackoverflow.Foo@7699a589, org.stackoverflow.Foo@58372a00, org.stackoverflow.Foo@4dd8dc3, org.stackoverflow.Foo@6d03e736]
    // [6, 4]
    // [bla1, bla2]
}

然而,现在我想知道为什么Class或Class不起作用。