【问题标题】:How to return null for a character returning method in java?如何在java中为字符返回方法返回null?
【发布时间】:2021-11-18 11:16:44
【问题描述】:
import java.util.*;

char[] characterArray1 = {'D', 'B', 'C', 'A', 'B', 'A'};
char[] characterArray2 = {'D', 'B', 'C', 'A', 'E', 'T'};
System.out.println(FRC(characterArray2));

public static char FRC(char[] array) {
        HashMap<Character, Integer> hashMap = new HashMap<Character, Integer>();
        for(char character: array) {
                if(hashMap.containsKey(character)) {
                        return character;
                }else {
                        hashMap.put(character, 1);
                }
        }return null
}

characterArray1 能够返回字符“B”,因为它是第一个重复出现的字符

那么当我使用 characterArray2 作为参数时,如何从字符返回方法中返回 null 呢?

【问题讨论】:

  • 如果你能够返回null(你不能),你需要测试方法是否返回null。同理可以测试是否返回0(即'\0')
  • 如果您要在找到重复项后立即返回,为什么要使用Map?只需使用Set

标签: java methods null char return


【解决方案1】:

正如 Andy Turner 的 correct Answer 所说,使用 Set 跟踪单个对象,而不是使用 Map 跟踪对象对。

代码点

char 类型(及其包装类Character)是遗留的,并且基本上已损坏。作为一个 16 位的值,它不能代表大多数字符。

改为使用code point 整数。

public static String firstRecurringCharacter ( List < String > inputs )
{
    Objects.requireNonNull( inputs );
    Set < Integer > seen = new HashSet <>();
    for ( String s : inputs )
    {
        Objects.requireNonNull( s , "Input of list of String objects contained a null." );
        if ( s.length() != 1) throw new IllegalStateException( "Input of list of String objects contained an element with other than one character." );
        if ( ! seen.add( s.codePointAt( 0 ) ) )
        {
            return s;
        }
    }
    return null;
}

用法。

List < String > inputX = List.of( "D" , "B" , "C" , "A" , "B" , "A" );
List < String > inputY = List.of( "D" , "B" , "C" , "A" , "E" , "T" );

System.out.println( App5.firstRecurringCharacter( inputX ) );
System.out.println( App5.firstRecurringCharacter( inputY ) );

运行时。

B

Optional

将 null 作为合法值返回是有问题的。在这种情况下,请使用 Optional 包装器。

public static Optional < String > firstRecurringCharacter ( List < String > inputs )
{
    Objects.requireNonNull( inputs );
    Set < Integer > seen = new HashSet <>();
    for ( String s : inputs )
    {
        Objects.requireNonNull( s , "Input of list of String objects contained a null." );
        if ( s.length() != 1 ) throw new IllegalStateException( "Input of list of String objects contained an element with other than one character." );
        if ( ! seen.add( s.codePointAt( 0 ) ) )
        {
            return Optional.of( s );
        }
    }
    return Optional.empty();
}

用法。

List < String > inputX = List.of( "D" , "B" , "C" , "A" , "B" , "A" );
List < String > inputY = List.of( "D" , "B" , "C" , "A" , "E" , "T" );

System.out.println( App5.firstRecurringCharacter( inputX ).orElse( "No recurring characters." ) );
System.out.println( App5.firstRecurringCharacter( inputY ).orElse( "No recurring characters." ) );

运行时。

B

没有重复的字符。

String 而不是字符列表

当然,在上面的代码中,你不需要使用代码点整数给定一个字符串输入,每个字符串都有一个字符。您可以只为代码点创建 Set&lt; String &gt; 而不是 Set&lt; Integer &gt;

代码点的用处在于拆分一个由多个字符组成的字符串。所以调用程序员不需要传递单字符串的集合。相反,可以传递多个字符的String

public static Optional < String > firstRecurringCharacter ( String input )
{
    Objects.requireNonNull( input );
    int[] codePoints = input.codePoints().toArray();
    Set < Integer > seen = new HashSet <>();
    for ( int codePoint : codePoints )
    {
        if ( ! seen.add( codePoint ) )
        {
            return Optional.of( Character.toString( codePoint ) );
        }
    }
    return Optional.empty();
}

用法。

String inputX = "DBCABA";
String inputY = "DBCAET";
String inputZ = "?ABC?ABC";

System.out.println( App5.firstRecurringCharacter( inputX ).orElse( "No recurring characters." ) );
System.out.println( App5.firstRecurringCharacter( inputY ).orElse( "No recurring characters." ) );
System.out.println( App5.firstRecurringCharacter( inputZ ).orElse( "No recurring characters." ) );

运行时。

B

没有重复的字符。

?

【讨论】:

    【解决方案2】:

    如果需要返回null,则需要将返回类型设为原始包装类型Character

    另外,这里没有明显需要使用Map:使用Set,并使用Set.add的返回值作为该字符之前出现过的指示:

    public static Character FRC(char[] array) {
      Set<Character> seen = new HashSet<>();
      for (Character c : array) {
        if (!seen.add(c)) {
          return c;
        }
      }
      return null;
    }
    

    【讨论】:

      【解决方案3】:

      您需要使用Character,它将原始类型char 的值包装在一个对象中。

      public static Character FRC(char[] array) {
              HashMap<Character, Integer> hashMap = new HashMap<Character, Integer>();
              for(char character: array) {
                      if(hashMap.containsKey(character)) {
                              return character;
                      }else {
                              hashMap.put(character, 1);
                      }
              }
              return null;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-02-12
        • 2012-06-13
        • 2014-02-07
        • 2012-05-19
        • 1970-01-01
        • 2014-07-28
        • 2015-03-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多