69

如何ArrayList使用整数和字符串输入类型创建一个?如果我创建一个:

List<Integer> sections = new ArrayList <Integer>();

那将是一种Integer类型ArrayList。如果我创建一个:

List<String> sections = new ArrayList <String>();

那将是String类型。如何创建ArrayList可以同时采用整数和字符串输入类型的?谢谢你。

4

13 回答 13

85

你可以让它像:

List<Object> sections = new ArrayList <Object>();

推荐)另一种可能的解决方案是创建一个具有两个参数的自定义模型类,一个是整数,另一个是字符串。然后使用ArrayList该对象的一个​​。

于 2013-10-26T03:53:33.350 回答
33

(1)

   ArrayList<Object> list = new ArrayList <>();`     
   list.add("ddd");
   list.add(2);
   list.add(11122.33);    
   System.out.println(list);

(2)

 ArrayList arraylist = new ArrayList();
 arraylist.add(5);        
 arraylist.add("saman");     
 arraylist.add(4.3);        
 System.out.println(arraylist);
于 2016-11-08T18:00:05.913 回答
19

您可以使用 Object 来存储任何类型的值,例如 int、float、String、类对象或任何其他 java 对象,因为它是所有类的根。例如

  1. 声明一个类

    class Person {
    public int personId;
    public String personName;
    
    public int getPersonId() {
        return personId;
    }
    
    public void setPersonId(int personId) {
        this.personId = personId;
    }
    
    public String getPersonName() {
        return personName;
    }
    
    public void setPersonName(String personName) {
        this.personName = personName;
    }}
    
  2. main函数代码,创建新的person对象,int、float、string类型,然后添加到List中,使用for循环进行迭代。识别每个对象,然后打印值。

        Person p = new Person();
    p.setPersonId(1);
    p.setPersonName("Tom");
    
    List<Object> lstObject = new ArrayList<Object>();
    lstObject.add(1232);
    lstObject.add("String");
    lstObject.add(122.212f);
    lstObject.add(p);
    
    for (Object obj : lstObject) {
        if (obj.getClass() == String.class) {
            System.out.println("I found a string :- " + obj);
        }
        if (obj.getClass() == Integer.class) {
            System.out.println("I found an int :- " + obj);
        }
        if (obj.getClass() == Float.class) {
            System.out.println("I found a float :- " + obj);
        }
        if (obj.getClass() == Person.class) {
            Person person = (Person) obj;
            System.out.println("I found a person object");
            System.out.println("Person Id :- " + person.getPersonId());
            System.out.println("Person Name :- " + person.getPersonName());
        }
    }
    

您可以在此链接Object in java上找到有关对象类的更多信息

于 2013-10-26T04:14:39.133 回答
7

创建您自己的存储字符串和整数的类,然后列出这些对象。

class Stuff {
    private String label;
    private Integer value;

    // Constructor
    public void Stuff(String label, Integer value) {
        if (label == null || value == null) {
            throw NullPointerException();
        }
        this.label = label;
        this.value = value;
    }

    // getters
    public String getLabel() {
        return this.label;
    }

    public Integer getValue() {
        return this.value;
    }
}

然后在您的代码中:

private List<Stuff> items = new ArrayList<Stuff>();
items.add(new Stuff(label, value));

for (Stuff item: items) {
     doSomething(item.getLabel()); // returns String
     doSomething(item.getValue()); // returns Integer
}
于 2014-04-05T16:40:00.577 回答
7
List<Object> list = new ArrayList<>();
          list.add(1);
          list.add("1");

由于 ArrayList 的返回类型是对象,您可以向 ArrayList 添加任何类型的数据,但使用 ArrayList 不是一个好习惯,因为有不必要的装箱和拆箱。

于 2015-11-21T11:23:15.440 回答
6

你可以创建一个List<Object>,但你真的不想这样做。抽象为 Object 的混合列表不是很有用,并且是潜在的错误来源。事实上,您的代码需要这样的构造,这让您的代码有一种不好的代码气味,并表明它的设计可能是错误的。考虑重新设计您的程序,这样您就不会被迫与猩猩一起收集橙子。

相反——按照 GV 的建议和我将要推荐的方式,创建一个同时包含 int 和 String 的自定义类,并为其创建一个 ArrayList。1+他的回答!

于 2013-10-26T03:53:00.133 回答
3

这取决于用例。请你能再描述一下吗?

  • 如果您希望能够同时添加两者,那么您可以做到@Sanket Parikh 很好地描述了这一点。将 Integer 和 String 放入一个新类并使用它。

  • 如果您想添加一个 String 或 int 列表,但一次只能添加其中一个,那么请确保它是List<Object>

    看起来不错,但仅用于第一眼!这不是一个好的模式。每次从列表中获取对象时,您都必须检查您拥有的对象类型。此外,这种类型的列表也可以包含任何其他类型。所以不,这不是一个好的解决方案。虽然也许对于初学者来说它可以使用。如果您选择此选项,我建议您检查 Java 中的“instanceof”是什么。

  • 我强烈建议您重新考虑您的需求并考虑您真正的需要是将整数封装到 aList<Integer>并将字符串封装到单独的List<String>

我可以告诉你一个比喻,你现在想做什么?我会说你想制作一个可以包含咖啡豆和咖啡店的列表。这些到类型的对象是完全不同的!为什么这些都放在同一个架子上?:)

或者您是否有可能是单词或数字的数据?是的!这是有道理的,它们都是数据!然后尝试将一个对象用于包含字符串数据的对象,如果需要,可以将其转换为整数值。

public class MyDataObj {
String info;
boolean isNumeric;

public MyDataObj(String info){
    setInfo(info);
}

public MyDataObj(Integer info){
    setInfo(info);
}

public String getInfo() {
    return info;
}

public void setInfo(String info) {
    this.info = info;
    this.isNumeric = false;
}

public void setInfo(Integer info) {
    this.info = Integer.toString(info);
    this.isNumeric = true;
}

public boolean isNumeric() {
    return isNumeric;
}
}

这样您就可以List<MyDataObj>根据自己的需要使用。同样,这取决于您的需求!:)

某版:使用inharitance怎么样?这比List<Object>解决方案更好,因为列表中不能有其他类型,然后是字符串或整数:接口:

public interface IMyDataObj {
public String getInfo();
}

对于字符串:

public class MyStringDataObj implements IMyDataObj {

final String info;

public MyStringDataObj(String info){
    this.info = info;
}

@Override
public String getInfo() {
    return info;
}
}

对于整数:

public class MyIntegerDataObj implements IMyDataObj {

final Integer info;

public MyIntegerDataObj(Integer info) {
    this.info = info;
}

@Override
public String getInfo() {
    return Integer.toString(info);
}
}

最后名单将是:List<IMyDataObj>

于 2016-12-12T13:39:15.240 回答
2

你总是可以创建一个ArrayListof Objects。但这对你不会很有用。假设您创建了Arraylist这样的:

List<Object> myList = new ArrayList<Object>();

并将对象添加到此列表中,如下所示:

myList.add(new Integer("5"));

myList.add("object");

myList.add(new Object());

添加和检索对象时您不会遇到任何问题,但它不会很有用。您必须记住每种类型的对象在什么位置才能使用它。在这种情况下,检索后,您所能做的就是调用Object它们的方法。

于 2013-10-26T04:18:36.877 回答
2

您不知道类型是 Integer 还是 String,那么您不需要 Generic。走旧风格。

List list= new ArrayList ();

list.add(1);
list.add("myname");

for(Object o = list){

} 
于 2013-10-26T03:57:55.603 回答
2

您可以将不同“类型”的对象添加到 ArrayList 的实例中。无需创建 ArrayList。看看下面的例子,你会得到下面的输出:

Beginning....
数组的内容:[String, 1]
列表的大小:2
这不是一个整数字符串
这是一个整数 1

package com.viswa.examples.programs;

import java.util.ArrayList;
import java.util.Arrays;

public class VarArrayListDemo {

    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static void main(String[] args) {
        System.out.println(" Beginning....");

        ArrayList varTypeArray = new ArrayList();
        varTypeArray.add("String");
        varTypeArray.add(1); //Stored as Integer

        System.out.println(" Contents of array: " + varTypeArray + "\n Size of the list: " + varTypeArray.size());

        Arrays.stream(varTypeArray.toArray()).forEach(VarArrayListDemo::checkType);
    }

    private static <T> void checkType(T t) {

        if (Integer.class.isInstance(t)) {
            System.out.println(" This is an Integer " + t);
        } else {
            System.out.println(" This is not an Integer" + t);
        }
    }

}
于 2015-10-05T14:59:35.697 回答
-1

只需使用 Entry(如在 java.util.Map.Entry 中)作为列表类型,并使用(java.util.AbstractMap's)SimpleImmutableEntry 填充它:

List<Entry<Integer, String>> sections = new ArrayList<>();
sections.add(new SimpleImmutableEntry<>(anInteger, orString)):
于 2020-03-18T21:47:36.507 回答
-1

对我来说,这种方法在 jdk 16 中效果很好

import java.util.ArrayList;
public class Array {
    public static void main(String[] args) {
        ArrayList arrayList= new ArrayList();
        arrayList.add("alien");
        arrayList.add(1);
        arrayList.add(0,'b');
        System.out.println(arrayList);
        System.out.println((arrayList.get(0)) instanceof Integer);
    }
}

输出

[b, alien, 1]
false
于 2021-06-02T14:53:17.727 回答
-4

用户定义类数组列表示例

import java.util.*;  

public class UserDefinedClassInArrayList {

    public static void main(String[] args) {

        //Creating user defined class objects  
        Student s1=new Student(1,"AAA",13);  
        Student s2=new Student(2,"BBB",14);  
        Student s3=new Student(3,"CCC",15); 

        ArrayList<Student> al=new ArrayList<Student>();
        al.add(s1);
        al.add(s2);  
        al.add(s3);  

        Iterator itr=al.iterator();  

        //traverse elements of ArrayList object  
        while(itr.hasNext()){  
            Student st=(Student)itr.next();  
            System.out.println(st.rollno+" "+st.name+" "+st.age);  
        }  
    }
}

class Student{  
    int rollno;  
    String name;  
    int age;  
    Student(int rollno,String name,int age){  
        this.rollno=rollno;  
        this.name=name;  
        this.age=age;  
    }  
} 

程序输出:

1 AAA 13

2 血脑屏障 14

3 CCC 15

于 2016-05-30T09:10:42.663 回答