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