有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我可以使用indexOf()在forloop中返回两个不同的值吗?

 String input = "B||B|B";       
 char bridgeMarker = 'B';
 char spaceMarker = '|';

 for(int i = 0; i < input.length(); i++)
 {
    int posB = input.indexOf(bridgeMarker, i);
    System.out.println("bridge index: " + posB);
    
    int posSp = input.indexOf(spaceMarker, i);
    System.out.println("space index: " + posSp);

    if(posB > 0 && posB < input.length() && posSp > 0 && posSp < input.length())
    {
        //do something
    }
 }

我试图在for循环的每次迭代中,在String input中找到“B”和“|”的每次出现的索引

int posSp = input.indexOf(spaceMarker, i);int posB = input.indexOf(bridgeMarker, i);分别工作很好,但当我使用它们时,我会得到令人困惑的输出:

bridge index: 1
space index: 0
bridge index: 1
plot index: 2
bridge index: 3
plot index: -1
bridge index: 3
space index: -1
bridge index: 4
space index: -1
bridge index: -1
space index: -1
bridge index: -1
space index: -1

我已经做了几个小时了,我很迷茫,所以如果有人能给我任何建议,我将不胜感激

以下是我计划修改字符串值的方式:

if(input.charAt(posSp - 1) == input.charAt(posB) || input.charAt(posSp + 1) == input.charAt(posB))
{
    if(input.charAt(posB - 1) != 'R' || input.charAt(posB + 1) != 'R') 
    {
        input = input.replace(spaceMarker, ropeMarker);
        System.out.println(input);
    }
}

共 (2) 个答案

  1. # 1 楼答案

    通过使用Java Regex API,您可以更轻松、更不容易出错:

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Main {
        public static void main(String[] args) {
            String input = "B||B|B";
            Pattern pattern = Pattern.compile("[B\\|]");
            Matcher matcher = pattern.matcher(input);
            while (matcher.find()) {
                System.out.println(matcher.group() + " => " + matcher.start());
            }
        }
    }
    

    输出:

    B => 0
    | => 1
    | => 2
    B => 3
    | => 4
    B => 5
    

    查看^{}^{}以了解更多关于它们的信息。您还可以查看Oracle提供的Lesson: Regular Expressions教程

  2. # 2 楼答案

    您的问题是,对于每个索引“i”,您都在检查从i开始到字符串末尾的子字符串。看看https://www.w3schools.com/java/ref_string_indexof.asp

    用这样的东西

    String input = "B||B|B";
    char bridgeMarker = 'B';
    char spaceMarker = '|';
    
    for (int i = 0; i < input.length(); i++) {
        if (input.charAt(i) == bridgeMarker) {
            System.out.println("B at index " + i);
        } else if (input.charAt(i) == spaceMarker) {
            System.out.println("| at index " + i);
        } else {
            System.out.println("Neither B nor | wos found");
        }
    }
    

    编辑 要使用程序中的值,请将它们存储在列表中

    String input = "B||B|B";
    char bridgeMarker = 'B';
    char spaceMarker = '|';
    
    List<Integer> bridgeMarkers = new ArrayList<>();
    List<Integer> spaceMarkers = new ArrayList<>();
    
    for (int i = 0; i < input.length(); i++) {
        if (input.charAt(i) == bridgeMarker) {
            bridgeMarkers.add(i);
            System.out.println("B at index " + i);
        } else if (input.charAt(i) == spaceMarker) {
            spaceMarkers.add(i);
            System.out.println("| at index " + i);
        } else {
            System.out.println("Neither B nor | wos found");
        }
    }
    
    System.out.println("bridgeMarkers: "+Arrays.toString(bridgeMarkers.toArray()));
    System.out.println("spaceMarkers: "+Arrays.toString(spaceMarkers.toArray()));
    
    // how to use them
    for (int i = 0; i < bridgeMarkers.size(); i++) {
        System.out.println("bridgeMarker nr " + i + " is at index " + bridgeMarkers.get(i));
    }
    
    for (int i = 0; i < spaceMarkers.size(); i++) {
        System.out.println("spaceMarker nr " + i + " is at index " + spaceMarkers.get(i));
    }