所以在輸入時,一個字串包含不同型別的資料。基本上,這是一個字串、整數和浮點數。Float.parseFloat()
我通過和檢查型別Integer.parseInt()
。作業Integer.parseInt()
正常,但Float.parseFloat()
包括所有檢查的數字。如何避免這種情況?
問題是在檢查 float 型別時,它還考慮 ints (output):
- 你好,我 50 的名字 4.5 是詹姆斯,我 20 歲,我有 5.7 個硬幣
- 浮點數 4
- 詮釋 2
- 字串 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);
}
}
uj5u.com熱心網友回復:
由于整數是浮點數的子型別,浮點數將以整數計入您的浮點數。如果您只想要非整數的浮點數,只需將浮點數減去整數數即可。
uj5u.com熱心網友回復:
一些標記(如“50”)既可以決議為整數也可以決議為浮點數。您的代碼給了他們兩個機會,即使您的意圖是將每個標記僅計為一種型別(因此將“50”計為整數,而不是浮點數)。
一個簡單的解決方法是將您的浮動檢查修改為:
- 確保
i
可以通過Float.parseFloat()
,并且 - 確認
i
包含小數點
該代碼編輯可能如下所示:
Float.parseFloat(i);
if (i.contains(".")) {
counter ;
continue;
}
或者,作為一個更復雜的替代方案,我將采用不同的方法,而不是檢查所有輸入標記的浮點數,然后重新檢查所有輸入標記的整數。
首先,我將更改代碼以停止重復檢查整個輸入字串。這對下面的第二部分很有幫助,但即使您已經確定了它們的資料型別,也可以消除重新檢查令牌的不必要的低效率。如果你有大量的標記,嘗試將它們全部決議為浮點數,然后嘗試將它們全部決議為整數,然后嘗試第三次計算純字串是很浪費的。
其次,由于您只會檢查(和計算)每個令牌一次,因此您可以:
- 檢查整數(在浮點數之前) - 如果它通過
Integer.parseInt()
,則增加該計數器并移動到下一個令牌 - 如果它不決議為整數,則嘗試將該標記決議為浮點數——只是
Float.parseFloat()
不尋找小數;如果它有效,則碰撞計數器,移動到下一個令牌 - 如果它不決議為整數或浮點數,你知道這是一個
String
簡單的碰撞計數器,然后是下一個標記
uj5u.com熱心網友回復:
正如其他人已經說過的那樣,因為int
是 的子集float
,您始終可以將表示 an 的字串決議int
為 a float
,而反之則不然。事實上,如果決議字串包含小數點分隔符并且您嘗試將其決議為int
,您將得到NumberFormatException
.
但是,您可以利用這種行為來發揮自己的優勢,并嘗試將每個字串決議為具有最小表示形式的資料型別 ( int
),并在決議失敗時逐漸增加它,直到達到最通用的表示形式 ( String
)。在您的情況下,您可以開始將每個字串決議為int
,如果它失敗,則繼續float
并最終String
如果float
決議也不起作用。
這是一個可能的實作:
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 {
listInt.add(Integer.parseInt(s));
} catch (NumberFormatException exInt) {
try {
listFloat.add(Float.parseFloat(s));
} catch (NumberFormatException exFloat) {
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
型別是更好的選擇。事實上,默認情況下,Java 將每個表示實數的文字視為 adouble
而不是 a float
。在上面的代碼片段中,我一直使用float
它來使我的代碼盡可能接近原始代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/491558.html