字符串中所有出现的字符的索引

时间:2011-02-17 20:46:23

标签: java loops indexing character

以下代码将打印2

String word = "bannanas";
String guess = "n";
int index;
System.out.println( 
    index = word.indexOf(guess)
);

我想知道如何在字符串“bannanas”中获取“n”(“guess”)的所有索引

预期结果为:[2,3,5]

15 个答案:

答案 0 :(得分:136)

这应该打印Peter Lawrey's solution 已经结束时没有-1的职位列表。

int index = word.indexOf(guess);
while (index >= 0) {
    System.out.println(index);
    index = word.indexOf(guess, index + 1);
}

它也可以作为for循环完成:

for (int index = word.indexOf(guess);
     index >= 0;
     index = word.indexOf(guess, index + 1))
{
    System.out.println(index);
}

[注意:如果guess可能比单个字符长,那么通过分析guess字符串,可以比上述循环更快地循环word。这种方法的基准是Boyer-Moore algorithm。但是,似乎不存在有利于使用这种方法的条件。]

答案 1 :(得分:21)

尝试以下(现在不打印-1!)

int index = word.indexOf(guess);
while(index >= 0) {
   System.out.println(index);
   index = word.indexOf(guess, index+1);
}

答案 2 :(得分:6)

String string = "bannanas";
ArrayList<Integer> list = new ArrayList<Integer>();
char character = 'n';
for(int i = 0; i < string.length(); i++){
    if(string.charAt(i) == character){
       list.add(i);
    }
}

结果将如下使用:

    for(Integer i : list){
        System.out.println(i);
    }

或者作为一个数组:

list.toArray();

答案 3 :(得分:4)

使用Java9,可以使用iterate(int seed, IntPredicate hasNext,IntUnaryOperator next),如下所示: -

void ServerStuff() {
    WSADATA WsData;
    int ret = WSAStartup(MAKEWORD(2, 2), &WsData);
    if (ret != 0) {
        wxLogMessage("Can't initialize Winsock! Error: %d", ret);
        return;
    }

    //Create a socket
    SOCKET listening = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (listening == INVALID_SOCKET) {
        wxLogMessage("Can't create a socket! Error: %d", WSAGetLastError());
        WSACleanup();
        return;
    }

    //Bind the ip and port to a socket
    sockaddr_in hint = {};
    hint.sin_family = AF_INET;
    hint.sin_port = htons(54000);
    hint.sin_addr.s_addr = INADDR_ANY; //Could also use inet_pton

    ret = bind(listening, (sockaddr*)&hint, sizeof(hint));
    if (ret == SOCKET_ERROR) {
        wxLogMessage("Can't bind socket! Error: %d", WSAGetLastError());
        closesocket(listening);
        WSACleanup();
        return;
    }

    //Tell winsock the socket is for listening
    ret = listen(listening, SOMAXCONN);
    if (ret == SOCKET_ERROR) {
        wxLogMessage("Can't listen on socket! Error: %d", WSAGetLastError());
        closesocket(listening);
        WSACleanup();
        return;
    }

    //Wait for a connection
    sockaddr_in client = {};
    int clientSize = sizeof(client);

    SOCKET clientSocket = accept(listening, (sockaddr*)&client, &clientSize);
    if (clientSocket == INVALID_SOCKET) {
        wxLogMessage("Can't accept a client! Error: %d", WSAGetLastError());
        closesocket(listening);
        WSACleanup();
        return;
    }

    char host[NI_MAXHOST] = {};  //Client's remote name

    ret = getnameinfo((sockaddr*)&client, sizeof(client), host, NI_MAXHOST, NULL, 0, 0);
    if (ret != 0) {
        wxLogMessage("Can't get client name info! Error: %d", ret);
        inet_ntop(AF_INET, &(client.sin_addr), host, NI_MAXHOST);
    }

    wxLogMessage("Client: %s, Connected on port: %hu", host, ntohs(client.sin_port));

    //Close listening socket - we don't need it anymore - later on we'll learn how to accept multiple client
    closesocket(listening);

    //while loop: accept and echo message back to client
    char buf[4096];
    int bytesReceived;

    while (true)
    {
        //Wait for client to send data
        bytesReceived = recv(clientSocket, buf, sizeof(buf), 0);

        if (bytesReceived == SOCKET_ERROR) {
            wxLogMessage("Can't read from client! Error: ", WSAGetLastError());
            break;
        }

        if (bytesReceived == 0) {
            wxLogMessage("Client Disconnected");
            break;
        }

        //Echo back to client
        ret = send(clientSocket, buf, bytesReceived, 0);
        if (ret == SOCKET_ERROR) {
            wxLogMessage("Can't send to client! Error: ", WSAGetLastError());
            break;
        }
    }

    //Close the socket
    closesocket(clientSocket);

    //Cleanup winsock
    WSACleanup();

    wxLogMessage("Welp");
}

答案 4 :(得分:4)

这可以使用正则表达式在Java 9中以功能方式完成:

Pattern.compile(Pattern.quote(guess)) // sanitize input and create pattern
            .matcher(word) // create matcher
            .results()     // get the MatchResults, Java 9 method
            .map(MatchResult::start) // get the first index
            .collect(Collectors.toList()) // collect found indices into a list
    );

以下是Kotlin解决方案,使用扩展方法将此逻辑作为新的新方法添加到CharSequence API中:

 // Extension method
fun CharSequence.indicesOf(input: String): List<Int> =
    Regex(Pattern.quote(input)) // build regex
        .findAll(this)          // get the matches
        .map { it.range.first } // get the index
        .toCollection(mutableListOf()) // collect the result as list

// call the methods as
"Banana".indicesOf("a") // [1, 3, 5]

答案 5 :(得分:2)

int index = -1;
while((index = text.indexOf("on", index + 1)) >= 0) {
   LOG.d("index=" + index);
}

答案 6 :(得分:2)

Java 8+

要在 TCADRACT PPPPPPPP ········ ········ ········ ········ pppppppp tcadract 中查找特定字符的所有索引,可以创建所有索引的 IntStream 并对其进行 sudo gpasswd -a postgres ssl-cert # Fixed ownership and mode sudo chown root:ssl-cert /etc/ssl/private/ssl-cert-snakeoil.key sudo chmod 740 /etc/ssl/private/ssl-cert-snakeoil.key # now postgresql starts! (and install command doesn't fail anymore) sudo service postgresql restart````

String

答案 7 :(得分:1)

String word = "bannanas";

String guess = "n";

String temp = word;

while(temp.indexOf(guess) != -1) {
     int index = temp.indexOf(guess);
     System.out.println(index);
     temp = temp.substring(index + 1);
}

答案 8 :(得分:0)

    String input = "GATATATGCG";
    String substring = "G";
    String temp = input;
    String indexOF ="";
    int tempIntex=1;

    while(temp.indexOf(substring) != -1)
    {
        int index = temp.indexOf(substring);
        indexOF +=(index+tempIntex)+" ";
        tempIntex+=(index+1);
        temp = temp.substring(index + 1);
    }
    Log.e("indexOf ","" + indexOF);

答案 9 :(得分:0)

此外,如果你想在String中找到String的所有索引。

int index = word.indexOf(guess);
while (index >= 0) {
    System.out.println(index);
    index = word.indexOf(guess, index + guess.length());
}

答案 10 :(得分:0)

我也有这个问题,直到我提出这个方法。

public static int[] indexesOf(String s, String flag) {
    int flagLen = flag.length();
    String current = s;
    int[] res = new int[s.length()];
    int count = 0;
    int base = 0;
    while(current.contains(flag)) {
        int index = current.indexOf(flag);
        res[count] = index + base;
        base += index + flagLen;
        current = current.substring(current.indexOf(flag) + flagLen, current.length());
        ++ count;
    }
    return Arrays.copyOf(res, count);
}

此方法可用于查找字符串中任何长度的任何标志的索引,例如:

public class Main {

    public static void main(String[] args) {
        int[] indexes = indexesOf("Hello, yellow jello", "ll");

        // Prints [2, 9, 16]
        System.out.println(Arrays.toString(indexes));
    }

    public static int[] indexesOf(String s, String flag) {
        int flagLen = flag.length();
        String current = s;
        int[] res = new int[s.length()];
        int count = 0;
        int base = 0;
        while(current.contains(flag)) {
            int index = current.indexOf(flag);
            res[count] = index + base;
            base += index + flagLen;
            current = current.substring(current.indexOf(flag) + flagLen, current.length());
            ++ count;
        }
        return Arrays.copyOf(res, count);
    }
}

答案 11 :(得分:0)

我想出了一个用于分割字符串的类。最后提供了一个简短的测试。

如果可能的话,

SplitStringUtils.smartSplitToShorterStrings(String str, int maxLen, int maxParts)将按空格分割而不会破坏单词,否则,将根据maxLen按索引拆分。

为控制分割方式而提供的其他方法:bruteSplitLimit(String str, int maxLen, int maxParts)spaceSplit(String str, int maxLen, int maxParts)

public class SplitStringUtils {

  public static String[] smartSplitToShorterStrings(String str, int maxLen, int maxParts) {
    if (str.length() <= maxLen) {
      return new String[] {str};
    }
    if (str.length() > maxLen*maxParts) {
      return bruteSplitLimit(str, maxLen, maxParts);
    }

    String[] res = spaceSplit(str, maxLen, maxParts);
    if (res != null) {
      return res;
    }

    return bruteSplitLimit(str, maxLen, maxParts);
  }

  public static String[] bruteSplitLimit(String str, int maxLen, int maxParts) {
    String[] bruteArr = bruteSplit(str, maxLen);
    String[] ret = Arrays.stream(bruteArr)
          .limit(maxParts)
          .collect(Collectors.toList())
          .toArray(new String[maxParts]);
    return ret;
  }

  public static String[] bruteSplit(String name, int maxLen) {
    List<String> res = new ArrayList<>();
    int start =0;
    int end = maxLen;
    while (end <= name.length()) {
      String substr = name.substring(start, end);
      res.add(substr);
      start = end;
      end +=maxLen;
    }
    String substr = name.substring(start, name.length());
    res.add(substr);
    return res.toArray(new String[res.size()]);
  }

  public static String[] spaceSplit(String str, int maxLen, int maxParts) {
    List<Integer> spaceIndexes = findSplitPoints(str, ' ');
    List<Integer> goodSplitIndexes = new ArrayList<>();
    int goodIndex = -1; 
    int curPartMax = maxLen;
    for (int i=0; i< spaceIndexes.size(); i++) {
      int idx = spaceIndexes.get(i);
      if (idx < curPartMax) {
        goodIndex = idx;
      } else {
        goodSplitIndexes.add(goodIndex+1);
        curPartMax = goodIndex+1+maxLen;
      }
    }
    if (goodSplitIndexes.get(goodSplitIndexes.size()-1) != str.length()) {
      goodSplitIndexes.add(str.length());
    }
    if (goodSplitIndexes.size()<=maxParts) {
      List<String> res = new ArrayList<>();
      int start = 0;
      for (int i=0; i<goodSplitIndexes.size(); i++) {
        int end = goodSplitIndexes.get(i);
        if (end-start > maxLen) {
          return null;
        }
        res.add(str.substring(start, end));
        start = end;
      }
      return res.toArray(new String[res.size()]);
    }
    return null;
  }


  private static List<Integer> findSplitPoints(String str, char c) {
    List<Integer> list = new ArrayList<Integer>();
    for (int i = 0; i < str.length(); i++) {
      if (str.charAt(i) == c) {
        list.add(i);
      }
    }
    list.add(str.length());
    return list;
  }
}

简单的测试代码:

  public static void main(String[] args) {
    String [] testStrings = {
        "123",
        "123 123 123 1123 123 123 123 123 123 123",
        "123 54123 5123 513 54w567 3567 e56 73w45 63 567356 735687 4678 4678 u4678 u4678 56rt64w5 6546345",
        "1345678934576235784620957029356723578946",
        "12764444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444",
        "3463356 35673567567 3567 35 3567 35 675 653 673567 777777777777777777777777777777777777777777777777777777777777777777"
    };

    int max = 35;
    int maxparts = 2;


    for (String str : testStrings) {
      System.out.println("TEST\n    |"+str+"|");
      printSplitDetails(max, maxparts);
      String[] res = smartSplitToShorterStrings(str, max, maxparts);
      for (int i=0; i< res.length;i++) {
        System.out.println("  "+i+": "+res[i]);
      }
      System.out.println("===========================================================================================================================================================");
    }

  }

  static void printSplitDetails(int max, int maxparts) {
    System.out.print("  X: ");
    for (int i=0; i<max*maxparts; i++) {
      if (i%max == 0) {
        System.out.print("|");
      } else {
        System.out.print("-");
      }
    }
    System.out.println();
  }

答案 12 :(得分:0)

这是Java 8解决方案。

loaded_model.predict_proba(inputs)[:,1]

答案 13 :(得分:-1)

这可以通过在myString中迭代fromIndex并转移indexOf()参数来完成:

  int currentIndex = 0;

  while (
    myString.indexOf(
      mySubstring,
      currentIndex) >= 0) {

    System.out.println(currentIndex);

    currentIndex++;
  }

答案 14 :(得分:-2)

试试这个

String str = "helloslkhellodjladfjhello";
String findStr = "hello";

System.out.println(StringUtils.countMatches(str, findStr));
相关问题