合并整数字符串

Merge strings of ints

我卡住了...谁能告诉我我该怎么做:

这是所需的输入和输出:

输入:[4, 2, +, 8, +, 2, 5, multiply sign, 2]

输出:[42,+,8,+,25,multiply sign,2]

这是我最后一次尝试,但没有输出任何内容:

public static List<String> unifyNumbers(List<String> data) {
        List<String> temp = new ArrayList<String>();
        
        for (int i = 0; i < data.size(); i++) {
            String num = "";
            try {
                num += Integer.parseInt(data.get(i));
                for (int i2 = i; i < data.size(); i++) {
                    try {
                    
                        num += Integer.parseInt(data.get(i2));
                    } catch (NumberFormatException e) {
                        e.printStackTrace();
                        i = i2 - 1;
                        temp.add(num);
                        num = "";

                    }

                }
            } catch (NumberFormatException e) {
                e.printStackTrace();
                temp.add(data.get(i));

            }
        }
        return temp;
    }
import java.util.*;
import java.lang.*;
import java.io.*;

class Sample
{
    public static void main (String[] args) throws java.lang.Exception
    {
        List<String> sampleData = new ArrayList<String>();
        sampleData.add("1");
        sampleData.add("2");
        sampleData.add("*");
        sampleData.add("8");
        sampleData.add("+");
        sampleData.add("2");
        sampleData.add("5");
        List<String> resultList = unifyNumbers(sampleData);
        System.out.println(resultList);
    }
    
    public static List<String> unifyNumbers(List<String> data) {
        String concatedNum = "";
        List<String> resultList = new ArrayList<String>();
        for(String arrVal: data) {
            if(isInteger(arrVal)) {
                concatedNum += arrVal;
            } else {
                resultList.add(concatedNum);
                resultList.add(arrVal);
                concatedNum = "";
            }
        }
        if(!concatedNum.isEmpty()) {
            resultList.add(concatedNum);
        }
        return resultList;
    }
    
    public static boolean isInteger( String input ) {
        try {
            Integer.parseInt( input );
            return true;
        }
        catch( Exception e ) {
            return false;
        }
    }
}

Gowtham Nagarajan 似乎已经为您提供了更好的方法。我建议您使用他的代码的修改版本,检查您的字符串是否是没有 try/catch 块的整数(请参阅 this question 讨论为什么您当前的方法不是真的好的做法)。

我仍然会向您展示我所做的,只是为了帮助您了解您的第一个方法出了什么问题以及如何解决类似的问题。

我更改了您的代码以使其按您希望的方式运行。我用来发现问题的所有检查打印仍然在那里,让您了解如何在执行中发现问题。像这样的检查可以更容易地跟踪程序的“流程”并找出问题所在。您可以拿一张纸写下您的程序经过的每一步,检查将告诉您是否一切都按您希望的那样运行,或者是否存在不需要的行为。

 public static List<String> unifyNumbers(List<String> data) {
    List<String> temp = new ArrayList<String>();

    for (int i = 0; i < data.size(); i++) {
        String num = "";
        try {

            num = "" + Integer.parseInt(data.get(i));
            System.out.println("Check 1");

            for (int i2 = i + 1; i2 < data.size(); i2++) {

                try {

                    num += Integer.parseInt(data.get(i2));
                    System.out.println("Check 2");

                } catch (NumberFormatException e) {

                    System.out.println("Error inside loop");

                    e.printStackTrace();
                    i = i2 - 1;
                    System.out.println("To add:" + num);
                    temp.add(num);
                    num = "";
                    break;

                }

            }

        } catch (NumberFormatException e) {

            System.out.println("Error outside loop");

            e.printStackTrace();
            temp.add(data.get(i));

        }

        if (!num.equals("")) {
            System.out.println(num);
            temp.add(num);
        }
    }
    return temp;
}

在使用打印语句时,我发现您的原始代码从未离开第一个内部循环。最后的 print 语句 System.out.println(num); 打印出类似 44444444 的内容。像这样的提示可以帮助您使代码正常工作。

有很多小错误很容易通过这种方式找到。我建议你下次试试。祝你好运!

i2 变量不迭代,这就是您没有得到任何输出的原因。无论如何都不需要那个循环。在它自己的函数中测试一个字符串是否是一个数字可以稍微简化一些事情。

这里是修改后的解决方案,并且link给一个可以测试的地方。 http://tpcg.io/l2xbRASM

public static Boolean isNumeric(String value) {
         try {
             Integer.parseInt(value);
             return true;
         } catch(NumberFormatException e) {
             return false;
         }
          
}
     
public static List<String> unifyNumbers(List<String> data) {
        List<String> temp = new ArrayList<String>();
        String num = "";
        
        for (int i = 0; i < data.size(); i++) {

            // HelloWorld is the name of the class I am testing this in.
            if(HelloWorld.isNumeric(data.get(i))) {
                num += Integer.parseInt(data.get(i));    
            } else {
                temp.add(num);
                
                // this line adds the arithmetic operator to the resulting output
                temp.add(data.get(i)); 
                
                num = "";
            }
        }
        // add number that remains to the array
        if(num != "") 
            temp.add(num);
        return temp;
}

我希望这会增加其他人给出的答案。