public void NATOConverter(String name){
String [] words = {"Alpha", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot", "Golf", "Hotel"
, "India", "Juliett", "Kilo", "Lima", "Mike", "November", "Oscar", "Papa", "Quebec", "Romeo", "Sierra",
"Tango", "Uniform", "Victor", "Whiskey", "Xray", "Yankee", "Zulu"};
for (int i = 0;i< name.length();i++){
switch (name.charAt(i)){
case 'A':
case 'a':
break;
case 'b':
case 'B':
break;
}
}
}
}
你好,伙计们,我只是想问是否有一种更简单的方法来尝试从编辑文本中获得输入,并将每个字母转换为我的数组值之一,我正在努力思考一种方法,我可以采取任何建议?我不确定我现在做的是正确的
tl;input
.codePoints()
.mapToObj( this :: wordForCodePoint )
.toList()
input
.codePoints()
.mapToObj( this :: wordForCodePoint )
.toList()
并且,wordForCodePoint
方法:
if ( codePoint >= 65 && codePoint <= 90 ) { // US-ASCII for A-Z (uppercase) characters are code points 65 to 90.
return NatoConverter.natoWords.get( codePoint - 65 ); // Annoying zero-based index counting.
} else if ( codePoint >= 97 && codePoint <= 122 ) { // US-ASCII for a-z (lowercase) characters are code points 97 to 122.
return NatoConverter.natoWords.get( codePoint - 97 ); // Annoying zero-based index counting.
} else {
return "INVALID CODE POINT: " + codePoint;
}
详细信息显然您想生成一系列北约音标字母单词,输入字符串的每个字母对应一个单词。
List.of
数组也可以。但我更喜欢用List
。
在Java 9和更高版本中,我们可以通过调用List.of
来创建一个不可修改的列表。
List< String > natoWords = List.of( "Alpha", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot", "Golf", "Hotel", "India", "Juliett", "Kilo", "Lima", "Mike", "November", "Oscar", "Papa", "Quebec", "Romeo", "Sierra", "Tango", "Uniform", "Victor", "Whiskey", "Xray", "Yankee", "Zulu" ) ;
代码点,非char
Java中的char
类型是过时的,甚至不能表示Java支持的Unicode字符的一半。因此,我建议您养成使用Unicode码点整数的习惯。
我们需要你输入的每个字母的代码点号。在下面的代码中,我们得到每个字母的代码点的IntStream
(一系列int
数字,一个接一个)。将该流转换为List
。
List < Integer > codePoints = codePointsStream.boxed().toList();
.boxed()
调用将int
原语转换为Integer
对象。这并不重要;如果你不熟悉这一点,改天再来讨论。
在Java 16之前,将.toList()
替换为:.collect( Collectors.toList () )
。
List < Integer > codePoints = codePointsStream.boxed().collect( Collectors.toList () );
我们需要一个结果词的集合。我们创建一个空列表,预大小为输入中的Unicode字符数。
List < String > result = new ArrayList <>( codePoints.size() );
循环输入的代码点。对于每个代码点,测试它是大写的US-ASCII字母a-z还是小写的a-z。如果两者都不是,则抛出异常作为提示错误条件的一种方式。
从代码点到索引号
对于每个代码点,我们可以巧妙地将该数字转换为我们需要从北约单词的主列表中检索的索引号。List
的索引号使用恼人的从零开始计数。所以第一个是0,第二个是1,以此类推。我们通过减去A
或a
的代码点数(65或97)得到这样一个数字。例如:
- 对于
A
,我们用65减去65得到0
,我们需要得到的索引"Alpha"> - 对于
B
,我们用66减去65得到1
,我们需要得到的索引"Bravo">
for ( Integer codePoint : codePoints ) {
if ( codePoint >= 65 && codePoint <= 90 ) { // US-ASCII for A-Z (uppercase) characters are code points 65 to 90.
String word = NatoConverter.natoWords.get( codePoint - 65 ); // Annoying zero-based index counting.
result.add( word );
} else if ( codePoint >= 97 && codePoint <= 122 ) { // US-ASCII for a-z (lowercase) characters are code points 97 to 122.
String word = NatoConverter.natoWords.get( codePoint - 97 ); // Annoying zero-based index counting.
result.add( word );
} else {
throw new IllegalStateException( "Encountered non-ASCII code point: " + codePoint );
}
}
最后,我们返回一个不可修改的北约单词列表。我们调用List.copyOf
来生成一个可修改列表的副本。
return List.copyOf( result ); // Return unmodifiable list.
把这些代码放到一起。
package work.basil.example;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
public class NatoConverter {
private static List < String > natoWords = List.of( "Alpha" , "Bravo" , "Charlie" , "Delta" , "Echo" , "Foxtrot" , "Golf" , "Hotel" , "India" , "Juliett" , "Kilo" , "Lima" , "Mike" , "November" , "Oscar" , "Papa" , "Quebec" , "Romeo" , "Sierra" , "Tango" , "Uniform" , "Victor" , "Whiskey" , "Xray" , "Yankee" , "Zulu" );
public List < String > convert ( String input ) {
IntStream codePointsStream = input.codePoints();
List < Integer > codePoints = codePointsStream.boxed().toList(); // Before Java 16, replace `.toList()` with: .collect( Collectors.toList () )
List < String > result = new ArrayList <>( codePoints.size() );
for ( Integer codePoint : codePoints ) {
if ( codePoint >= 65 && codePoint <= 90 ) { // US-ASCII for A-Z (uppercase) characters are code points 65 to 90.
String word = NatoConverter.natoWords.get( codePoint - 65 ); // Annoying zero-based index counting.
result.add( word );
} else if ( codePoint >= 97 && codePoint <= 122 ) { // US-ASCII for a-z (lowercase) characters are code points 97 to 122.
String word = NatoConverter.natoWords.get( codePoint - 97 ); // Annoying zero-based index counting.
result.add( word );
} else {
throw new IllegalStateException( "Encountered non-ASCII code point: " + codePoint );
}
}
return List.copyOf( result ); // Return unmodifiable list.
}
}
编写一个小应用程序来调用该代码。
package work.basil.example;
import java.util.List;
public class App2 {
public static void main ( String[] args ) {
NatoConverter natoConverter = new NatoConverter();
List < String > result = natoConverter.convert( "Basil" );
System.out.println( result );
}
}
或者更简洁一点。
package work.basil.example;
public class App2 {
public static void main ( String[] args ) {
System.out.println(
new NatoConverter().convert( "Basil" )
);
}
}
我们得到这些结果:
[Bravo, Alpha, Sierra, India, Lima]
Streams, lambdas, &方法引用
熟悉了流、lambdas和方法引用之后,可以将转换器类重写为如下所示:
package work.basil.example;
import java.util.List;
public class NatoConverter {
private static List < String > natoWords = List.of( "Alpha" , "Bravo" , "Charlie" , "Delta" , "Echo" , "Foxtrot" , "Golf" , "Hotel" , "India" , "Juliett" , "Kilo" , "Lima" , "Mike" , "November" , "Oscar" , "Papa" , "Quebec" , "Romeo" , "Sierra" , "Tango" , "Uniform" , "Victor" , "Whiskey" , "Xray" , "Yankee" , "Zulu" );
public List < String > convert ( String input ) {
return List.copyOf(
input
.codePoints()
.mapToObj( this :: wordForCodePoint )
.toList()
);
}
public String wordForCodePoint ( int codePoint ) {
if ( codePoint >= 65 && codePoint <= 90 ) { // US-ASCII for A-Z (uppercase) characters are code points 65 to 90.
return NatoConverter.natoWords.get( codePoint - 65 ); // Annoying zero-based index counting.
} else if ( codePoint >= 97 && codePoint <= 122 ) { // US-ASCII for a-z (lowercase) characters are code points 97 to 122.
return NatoConverter.natoWords.get( codePoint - 97 ); // Annoying zero-based index counting.
} else {
return "INVALID CODE POINT: " + codePoint;
}
}
}
查看此代码运行在IdeOne.com。
[Bravo, Alpha, Sierra, India, Lima]
试试这个
static final Map<Character, String> WORDS = Stream.of(
"Alpha", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot", "Golf", "Hotel" ,
"India", "Juliett", "Kilo", "Lima", "Mike", "November", "Oscar", "Papa",
"Quebec", "Romeo", "Sierra", "Tango", "Uniform", "Victor", "Whiskey",
"Xray", "Yankee", "Zulu")
.collect(Collectors.toMap(word -> word.charAt(0), Function.identity()));
public static String NATOConverter(String name){
return name.toUpperCase().chars()
.mapToObj(c -> WORDS.get((char)c))
.filter(Objects::nonNull)
.collect(Collectors.joining(" "));
}
和
System.out.println(NATOConverter("Hello World"));
输出:
Hotel Echo Lima Lima Oscar Whiskey Oscar Romeo Lima Delta
public static String NATOConverter(String name)
{
String [] words =
{ "Alpha", "Bravo", "Charlie", "Delta", "Echo",
"Foxtrot", "Golf", "Hotel", "India", "Juliett",
"Kilo", "Lima", "Mike", "November", "Oscar",
"Papa", "Quebec", "Romeo", "Sierra", "Tango",
"Uniform", "Victor", "Whiskey", "Xray", "Yankee", "Zulu"
};
String output = "" ;
for( int i = 0 ; i < name.length() ; ++i )
{
if( name.charAt(i) == ' ' )
{
output += "(space) " ;
}
else
{
int utf8 = name.toUpperCase().charAt(i) ;
output += ( words[utf8 - 65] + " " ) ;
}
}
return output.substring(0, output.length()-1 /*remove last space*/ ) ;
}