Dowiedziałem się, jak policzyć wystąpienie wszystkich ciągów, oczekuję jednego z nich, ponieważ używam indexOf, ponieważ nie nauczyłem się niczego nowego w tej klasie, więc zastanawiałem się, czy mogę uzyskać pomoc tutaj jest kod . (Nie można policzyć pogrubionego „kota”)

class Main {


  public static void main(String[] args) {
    String[] arr= {"Catcat", "Dogsaregoodcatsarebetter", "Ilovecatcat", "Goatsarecutetoo"};
    System.out.println(countOccurence2(arr, "cat"));
    System.out.println(countOccurence2(arr, "cute"));
    System.out.println(countOccurence2(arr, "horse"));

  }


  public static int countOccurence2(String[]arr, String n)

  {

        int count = 0;


        for(int i = 0; i < arr.length; i++)
        {
            if(arr[i].indexOf(n) != -1)
            {

               count++;


            }
        }
        return count;
  }
}
0
Arrow 2 kwiecień 2020, 06:26

3 odpowiedzi

Najlepsza odpowiedź

Możesz użyć indexOf, aby policzyć wszystkie wystąpienia ciągu, ale musisz użyć formularz, który przyjmuje indeks, od którego ma się rozpocząć liczenie, czyli poprzednio znaleziony indeks oraz długość ciągu zapytania.

public static int countOccurence2(String[]arr, String n)
{
    int count = 0;
    for(int i = 0; i < arr.length; i++)
    {
      int idx = arr[i].indexOf(n);
      while(idx != -1)
      {
        count++;
        idx = arr[i].indexOf(n, idx+n.length());
      }
    }
    return count;
}

Który daje pożądaną wydajność: 4,1,0

1
RaffleBuffle 2 kwiecień 2020, 04:44

Możesz rzucić okiem na: https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringUtils .html # countMatches (java.lang.String,% 20java.lang.String)

  /**
   * <p>Counts how many times the substring appears in the larger string.</p>
   *
   * <p>A {@code null} or empty ("") String input returns {@code 0}.</p>
   *
   * <pre>
   * StringUtils.countMatches(null, *)       = 0
   * StringUtils.countMatches("", *)         = 0
   * StringUtils.countMatches("abba", null)  = 0
   * StringUtils.countMatches("abba", "")    = 0
   * StringUtils.countMatches("abba", "a")   = 2
   * StringUtils.countMatches("abba", "ab")  = 1
   * StringUtils.countMatches("abba", "xxx") = 0
   * </pre>
   *
   * @param str  the CharSequence to check, may be null
   * @param sub  the substring to count, may be null
   * @return the number of occurrences, 0 if either CharSequence is {@code null}
   * @since 3.0 Changed signature from countMatches(String, String) to countMatches(CharSequence, CharSequence)
   */
  public static int countMatches(final CharSequence str, final CharSequence sub) {
      if (isEmpty(str) || isEmpty(sub)) {
          return 0;
      }
      int count = 0;
      int idx = 0;
      while ((idx = CharSequenceUtils.indexOf(str, sub, idx)) != INDEX_NOT_FOUND) {
          count++;
          idx += sub.length();
      }
      return count;
  }

  /**
   * Used by the indexOf(CharSequence methods) as a green implementation of indexOf.
   *
   * @param cs the {@code CharSequence} to be processed
   * @param searchChar the {@code CharSequence} to be searched for
   * @param start the start index
   * @return the index where the search sequence was found
   */
  static int indexOf(final CharSequence cs, final CharSequence searchChar, final int start) {
      return cs.toString().indexOf(searchChar.toString(), start);
  }
0
geffchang 2 kwiecień 2020, 04:00

Spróbuj użyć tego

import java.util.regex.Pattern;
import java.util.regex.Matcher;

 public static int countOccurence2(String[]arr, String n) {
    Pattern p = Pattern.compile(n.toLowerCase());
    int count = 0;
    for(int i = 0; i < arr.length; i++)
    {
        Matcher m = p.matcher(arr[i].toLowerCase());
        while (m.find()) {
            count++;
        }
    }
    return count;
 }

Dzieje się tak, ponieważ używa wyrażenia regularnego do dopasowania wzorca w podanym ciągu. Myślę, że toLowerCasse() jest metodą, która nie wymaga wyjaśnień, nie ma potrzeby jej wyjaśniać.

Jeśli chcesz, aby wielkość liter była rozróżniana, po prostu usuń toLowerCase().

1
omar jayed 2 kwiecień 2020, 03:55