试图计算字符串中的数据类型数量

问题描述 投票:0回答:3
在输入时,字符串包含不同类型的数据。基本上,这是一个字符串,int和float。我通过

Float.parseFloat()

Integer.parseInt()
检查类型。 
Integer.parseInt()
工作正常,但是
Float.parseFloat()
包括所有已检查的数字。如何避免这种情况?

问题是,在检查浮点类型时,它还考虑INT(输出)

    我的50个名字4.5是詹姆斯,我20岁,我有5.7硬币
  • Float4
  • Int2
  • 串12
  • public class TypeCountString { public static void countTypeInString(String string){ String[] value = string.split(" "); float ifFloat; int ifInt; String ifString; int counter = 0; // count Floats for (String i: value){ try{ ifFloat = Float.parseFloat(i); counter++; continue; } catch (NumberFormatException e){ } } System.out.println("Float " + counter); //count ints counter = 0; for (String i: value){ try{ ifInt = Integer.parseInt(i); counter++; continue; } catch (NumberFormatException e){ } } System.out.println("Int " + counter); //counts strings String stringOfStrings = string.replaceAll("[0-9.]",""); stringOfStrings = stringOfStrings.replaceAll(" "," "); String[] value2 = stringOfStrings.split(" "); System.out.println("String " + value2.length); } public static void main(String[] args) { String string = "Hello my 50 name 4.5 is James, I 20 years old and i have 5.7 coins"; System.out.println(string); countTypeInString(string); } }
	
java string types type-conversion integer
3个回答
2
投票

有些令牌(例如“ 50”)作为整数和浮动都可以放松。即使您的意图是将每种令牌视为一种或另一种类型(因此,将“ 50”视为整数,而不是浮点)。

2
投票

确保

i

可以通过
    Float.parseFloat()
  • 确认
    i包含小数点
  • 代码编辑看起来像这样:
    Float.parseFloat(i);
    if (i.contains(".")) {
        counter++;
        continue;
    }
    
或作为一个更涉及的替代方案,而不是检查所有输入令牌是否有浮子,然后重新检查整数的所有输入令牌,而是采用其他方法。 首先,我将更改代码以停止重复检查整个输入字符串。这对于下面的第二部分很有帮助,但即使您已经确定了其数据类型,也可以清理不必要的重新检查令牌的不必要效率。如果您有大量的令牌,那么尝试将所有这些解析为浮子是浪费的,然后尝试所有这些作为整数,然后尝试第三次计算普通字符串。

第二,由于您只需检查(并计数)每个令牌,所以您可以:

检查整数(浮动之前) - 如果它通过

Integer.parseInt()

如果它不作为整数解析,请试图解析以float的代币 - 只是

Float.parseFloat()

而不寻找小数;如果起作用,请碰碰柜台,转到近token

    如果它不作为整数或浮动来解析,那么您就知道它是一个
  • String
    
        
  • 首先将每个子字符串放在
    float
  • 上也将分析整数,因为整数是实数的子集。 您应该开始解析最严格的类型(就可能的值而言),直到最少的限制性。在您的情况下,可能的值是:整数,实数和字符串。因此,您可以首先尝试将每个子弦解析为整数。如果失败,请尝试将其作为真实数字解析。如果那也失败了,只需将其视为
  • String
    启动整数是至关重要的,因为十进制分离器永远不会出现在整数中,毫无疑问地对我们解析的内容,而有实数,分隔符可能会或可能不会出现。
  • 要处理每次解析,只需使用一个
try-catch

2
投票
catch

NumberFormatException
块中。这是一个可能的实现:

public class Main { public static void main(String[] args) { countTypesInString(); } public static void countTypesInString() { String str = "Hello my 50 name 4.5 is James, I 20 years old and i have 5.7 coins"; String[] vetStr = str.split("\\s+"); List<Integer> listInt = new ArrayList<>(); List<Float> listFloat = new ArrayList<>(); List<String> listStr = new ArrayList<>(); for (String s : vetStr) { try { // attempt int parsing listInt.add(Integer.parseInt(s)); } catch (NumberFormatException exInt) { try { // attempt float parsing listFloat.add(Float.parseFloat(s)); } catch (NumberFormatException exFloat) { // just treat it as a String listStr.add(s); } } } System.out.println("Number of ints: " + listInt.size() + " => " + listInt); System.out.println("Number of floats: " + listFloat.size() + " => " + listFloat); System.out.println("Number of strings: " + listStr.size() + " => " + listStr); } }

输出:

Number of ints: 2 => [50, 20] Number of floats: 2 => [4.5, 5.7] Number of strings: 12 => [Hello, my, name, is, James,, I, years, old, and, i, have, coins]

作为旁注,您可能需要使用
double
而不是
float
表示实数,因为与后者相比,前者具有更高的精度。实际上,Java默认情况下将十进制文字视为
double

	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.