Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java从数组创建多维数组_Java_Arrays_Multidimensional Array - Fatal编程技术网

Java从数组创建多维数组

Java从数组创建多维数组,java,arrays,multidimensional-array,Java,Arrays,Multidimensional Array,我有一个数组对象[],其元素如下: Foo A Foo B Foo C notFoo A notFoo B notFoo C 我想从以下内容创建多维数组: Object[0][] = {Foo A, Foo B, Foo C} Object[1][] = {notFoo A, notFoo B, notFoo C} 因此,如果这个数组中的一个元素在它的第一个标记(例如Foo)中有一个在存储到另一个索引之前没有出现的名称 因此,第一个标记表示元素套件,这将导致数组中的另一个索引 有什么办法吗

我有一个数组对象[],其元素如下:

Foo A
Foo B
Foo C
notFoo A
notFoo B
notFoo C
我想从以下内容创建多维数组:

Object[0][] = {Foo A, Foo B, Foo C}
Object[1][] = {notFoo A, notFoo B, notFoo C}
因此,如果这个数组中的一个元素在它的第一个标记(例如Foo)中有一个在存储到另一个索引之前没有出现的名称

因此,第一个标记表示元素套件,这将导致数组中的另一个索引

有什么办法吗


编辑:元素的类型为字符串。

您可以执行以下操作

Map<Object.class, List<Object>>

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

额外的

使用数组意味着您从一开始就知道数组的长度,对于没有定义数组/列表长度的问题,最好使用诸如List/Map之类的数据结构

在注释中指定为Requeed的Util类

此类包含私有映射、向映射添加值的方法、获取映射的方法或映射的二维数组版本

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;
    }
}
测试上述代码的主要方法

主要测试方法的输出如下所示

打印地图

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

打印地图

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

打印二维阵列

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

这使得在不实例化类的情况下访问功能成为可能,如果您不希望为包含数据的映射制作包装,那么这可能会更好。这里有一些可能是一种极端的过度使用,但作为一个示例,仍然很有趣:

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]
}

但是,现在我想知道为什么类或类不起作用。

您可以使用映射来映射它们,然后您可以获得您输入的类型的列表,如果它不存在,您可以创建一个,然后将值添加到列表中。请注意,名称A、B和C是不存在的,只是变量名。我同意使用Map之类的映射,然后在新条目出现时加载并添加到列表中apears@Hendrik记住,每个人都喜欢找到有答案的问题:以后是否可以将其转换为数组?@Hendrik是的,如果非常需要数组,您可以访问映射和包含列表的大小,以从该映射生成数组或2d数组。keySet返回映射列表中的一组键。size返回列表的大小,然后仅从大小生成数组并输入值,但是,它必须是数组的具体原因是什么?@Hendrik我现在创建了一个类,它应该可以作为一个util类使用,并将其添加到answer@Hendrik完成了格式化和优化类,希望这就是您所看到的for@Hendrik意识到静态类aproach可能更适合这种情况,所以我在回答中也加了这个
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;
    }
}
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]
}