Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_List_Object_Type Conversion - Fatal编程技术网

Java 对列表执行整数运算<;对象>;

Java 对列表执行整数运算<;对象>;,java,list,object,type-conversion,Java,List,Object,Type Conversion,我有一个对象列表,我想将其转换为整数列表 List<Object> list = new ArrayList<>(); list.add("StringTest"); list.add(10); list.add(5.9); list.add(2.5f); list.add(12L); ... // different datatypes List<Integer> result = new ArrayList<>();

我有一个
对象列表
,我想将其转换为
整数列表

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

list.add("StringTest");
list.add(10);
list.add(5.9);
list.add(2.5f);
list.add(12L);
...            // different datatypes

List<Integer> result = new ArrayList<>();
// convert items from list and add to result
List List=new ArrayList();
列表。添加(“StringTest”);
增加(10);
列表。添加(5.9);
列表。添加(2.5f);
列表。添加(12L);
...            // 不同的数据类型
列表结果=新建ArrayList();
//从列表转换项目并添加到结果
将不同数据类型的
列表
中的值添加到
列表

  • 可以根据字符串的长度追加字符串
  • 浮点数需要四舍五入

  • 我知道上的标准实现,但我正在寻找一个好的结构来编写通用结构。

    如果只想添加数字而不处理字符串,可以使用以下方法:

       List<Object> list = new ArrayList<>();
    
        list.add("StringTest");
        list.add(10);
        list.add(5.9);
        list.add(2.5f);
        list.add(12L);
    
        List<Integer> result = new ArrayList<>();
    
         list.stream().filter(element -> element instanceof Number)
                .map(Number.class::cast)
                .mapToDouble(Number::doubleValue)
                .mapToLong(Math::round)
                .mapToInt(Math::toIntExact) // can throw ArithmeticException if long value overflows an int
                .forEach(result::add);
    
    List List=new ArrayList();
    列表。添加(“StringTest”);
    增加(10);
    列表。添加(5.9);
    列表。添加(2.5f);
    列表。添加(12L);
    列表结果=新建ArrayList();
    list.stream().filter(元素->元素实例编号)
    .map(Number.class::cast)
    .mapToDouble(数字::doubleValue)
    .mapToLong(数学:圆形)
    .mapToInt(Math::toIntExact)//如果长值溢出int,则可以引发算术异常
    .forEach(结果::添加);
    

    若您还想处理字符串,那个么您需要用长度为的int值替换列表中的字符串,然后按照上面提到的方式处理

    您可以使用streams来处理
    对象
    类型的列表,如下代码所示(按照注释):

    //将所有数字类型收集到整数
    List output1=List.stream()。
    筛选器(val->!(val instanceof String))。//筛选非字符串类型
    映射(val->((Number)val).floatValue())。//转换为数字并获取浮点值
    map(val->(int)Math.round(val))。//应用Math.round
    collect(Collectors.toList())//作为列表收集
    //将所有字符串类型收集到int
    List output2=List.stream()。
    筛选器(val->(val instanceof String))。//筛选器字符串类型
    映射(val->(((字符串)val.length())。//获取字符串长度
    collect(Collectors.toList())//作为列表收集
    //现在,合并两个列表
    output2.addAll(output1);
    

    浮点数需要四舍五入


    您需要首先使用
    floatValue()
    方法将
    Number
    值转换为
    float
    ,然后如上所示应用
    Math.round

    这样,您可以在添加到对象列表的同时将其添加到整数列表中

    final List<Integer> integerList=new ArrayList<Integer>();
    List<Object> list=new ArrayList<Object>(){
    
      public boolean add(Object e) {
        if(e instanceof String){
          integerList.add(((String)e).length());
        }
        if (e instanceof Float){
          integerList.add(Math.round((float) e));
        }
        else{
          // other cases
        }
        return super.add(e);
      };
    };
    list.add("StringTest");
    list.add(10);
    list.add(5.9);
    list.add(2.5f);
    list.add(12L);
    
    final List integerList=new ArrayList();
    列表=新的ArrayList(){
    公共布尔加法(对象e){
    if(字符串的e实例){
    integerList.add(((String)e).length());
    }
    if(e浮点实例){
    integerList.add(Math.round((float)e));
    }
    否则{
    //其他情况
    }
    返回super.add(e);
    };
    };
    列表。添加(“StringTest”);
    增加(10);
    列表。添加(5.9);
    列表。添加(2.5f);
    列表。添加(12L);
    
    操作符的
    instanceof
    将使此操作相对简单

    public class Convert {
        public static int toInt(Object o) {
            if (o instanceof String) {
                return ((String)o).length();
            } else if (o instanceof Number) {
                return Math.round(((Number)o).floatValue());
            } else {
                return o.hashCode(); // or throw an exception
            }
        }
    }
    
    使用Java8,您可以使用
    转换值

    List<Object> list = new ArrayList<>();
    
    list.add("StringTest");
    list.add(10);
    list.add(5.9);
    list.add(2.5f);
    list.add(12L);
    
    List<Integer> result = list.stream().map(Convert::toInt).collect(Collectors.toList());
    
    List List=new ArrayList();
    列表。添加(“StringTest”);
    增加(10);
    列表。添加(5.9);
    列表。添加(2.5f);
    列表。添加(12L);
    List result=List.stream().map(Convert::toInt).collect(Collectors.toList());
    
    听起来您已经有了如何实施的计划。你有什么问题吗?看起来Java8有一种使用流来处理类型转换的秘密方法。起初,我想写一种方法,可以处理不同的
    实例的
    操作。这就是为什么我在考虑一个定制的实现,我可以
    浮点数取整为最接近的值。我希望我能接受多个答案。看起来很棒。但是,您能告诉我是否可以使用
    Math.round
    到最接近的十进制值吗?我已经更新了代码,请看一下使用
    Math.round
    谢谢@javaguy的代码和解释(注释)<代码>流
    功能强大,我应该开始使用它们。是的,你是对的,它们非常强大,即它们提供干净/更简单的代码来处理数据
    List<Object> list = new ArrayList<>();
    
    list.add("StringTest");
    list.add(10);
    list.add(5.9);
    list.add(2.5f);
    list.add(12L);
    
    List<Integer> result = list.stream().map(Convert::toInt).collect(Collectors.toList());