Java 字符串数组二进制搜索字符

Java 字符串数组二进制搜索字符,java,binary,Java,Binary,我有一个项目,需要用户输入一个字符串,然后你应该在字符串中搜索一个字符及其出现的次数。我在使用二进制算法搜索字符时遇到问题。到目前为止,我得到的是: package assignment3; import java.util.Scanner; public class charSearch{ public static void main(String[] arg){ Scanner thisString=new Scanner(System.in);

我有一个项目,需要用户输入一个字符串,然后你应该在字符串中搜索一个字符及其出现的次数。我在使用二进制算法搜索字符时遇到问题。到目前为止,我得到的是:

package assignment3;

import java.util.Scanner;

public class charSearch{

    public static void main(String[] arg){

        Scanner thisString=new Scanner(System.in);

        System.out.println("Hello there! Please type in a few words and enter 'Done' when you are finished");

        String line=thisString.nextLine();

        String[] lineArray=line.split("\\ ");

        int lengthOfString=lineArray.length;

        String terminator="Done";

        String[] newArray=new String[lengthOfString-1];

        for(int i=0; i<lengthOfString-1; i++){

            if(lineArray[i]!=terminator){

                newArray[i]=lineArray[i];

                System.out.println(newArray[i]);

            }

        }

        int lengthOfArray=newArray.length;

    }

}
包分配3;
导入java.util.Scanner;
公共类字符搜索{
公共静态void main(字符串[]arg){
扫描器thisString=新扫描器(System.in);
System.out.println(“您好!请键入几个单词,完成后输入'Done'”);
String line=thistring.nextLine();
String[]lineArray=line.split(“\\”);
int lengthOfString=lineArray.length;
字符串终止符=“完成”;
字符串[]新数组=新字符串[LengthofsString-1];

对于(inti=0;i我想如果我真的了解你想要得到的东西,你想要的是这样的东西

package snippet;

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Scanner;

public class Snippet {

public static void main(String[] arg) {

    countCharacters();
}

private static void countCharacters() {

    Scanner thisString = new Scanner(System.in);

    System.out.println("Hello there! Please type in a few words and enter 'Done' when you are finished");

    String line = "", lettersToSearchFrom = "";

    while (!("Done").equals(line)) {

        line = thisString.nextLine();

        lettersToSearchFrom += line;
    }

    thisString.close();

    //Since "Done" takes up 4 characters, it will be removed
    int beginPoint = lettersToSearchFrom.length()-4;
    int endPoint = lettersToSearchFrom.length();

    //Replaces the last line entered which is "Done" as its not part of the letters to search from
    char[] characters = lettersToSearchFrom.toLowerCase().substring(0,beginPoint).toCharArray();

    System.out.println(lettersToSearchFrom);

    HashMap<Character, Integer> map = new HashMap<Character, Integer>();

    //This is where the counting happens
    for (char key : characters) {

        if (map.containsKey(key)) {

            int frequency = map.get(key);
            frequency++;
            map.put(key, frequency);
        } else {
            map.put(key, 1);
        }

    }

    // Display frequency for each character ignoring case
    for (Entry<Character, Integer> item : map.entrySet()) {
        System.out.println(item.getKey() + " = " + item.getValue());
    }

    //To display the frequency of a specific character you can just retrieve from map
    //The following is if we searching specifically for "A" and not "a"
    //Please keep in mind that everything was made to lower case so a '0' should be return for value of "A"
    //since it is not contained

    int frequency = map.get("A")==null?0:map.get("A");

    System.out.println("Number of occurences for 'A' is "+frequency);

}
}
包片段;
导入java.util.HashMap;
导入java.util.Map.Entry;
导入java.util.Scanner;
公共类代码段{
公共静态void main(字符串[]arg){
countCharacters();
}
私有静态void countCharacters(){
扫描器thisString=新扫描器(System.in);
System.out.println(“您好!请键入几个单词,完成后输入'Done'”);
字符串line=“”,lettersToSearchFrom=“”;
而(!(“完成”)。等于(行)){
line=thisString.nextLine();
lettersToSearchFrom+=行;
}
thisString.close();
//由于“完成”占4个字符,因此将删除它
int beginPoint=lettersToSearchFrom.length()-4;
int endPoint=lettersToSearchFrom.length();
//将输入的最后一行“完成”替换为它不是要从中搜索的字母的一部分
char[]characters=lettersToSearchFrom.toLowerCase().substring(0,beginPoint.tocharray();
System.out.println(lettersToSearchFrom);
HashMap=newHashMap();
//这就是计数的地方
for(字符键:字符){
if(地图容器(图例)){
int frequency=map.get(键);
频率++;
map.put(键、频率);
}否则{
地图放置(图例1);
}
}
//忽略大小写的每个字符的显示频率
对于(条目项:map.entrySet()){
System.out.println(item.getKey()+“=”+item.getValue());
}
//要显示特定字符的频率,只需从地图中检索即可
//如果我们专门搜索“A”而不是“A”,则如下所示
//请记住,所有内容都是小写的,因此值“a”应返回“0”
//因为它没有被包含
int frequency=map.get(“A”)==null?0:map.get(“A”);
System.out.println(“A”的发生次数为“+频率”);
}
}

我看到一个潜在的错误
如果(lineArray[I]!=terminator)
它应该是
如果(!lineArray[I].equals(terminator))
。话虽如此,问题出在哪里?搜索算法在哪里?你不能对未排序的内容使用二进制搜索。为什么不进行线性扫描?你的数组复制逻辑有缺陷。它会复制除“完成”之外的所有单词,甚至是在“完成”之后出现的单词。你需要将OWRD计数到“完成”在调整最终数组的大小之前。或者只使用一些会自动增长的列表类型(如ArrayList)。您的需求(计算字母)也不需要二进制搜索。你的问题不清楚。将你想要得到的东西作为输出发布。你在尝试什么,失败在哪里。事实上,代码之所以如此基础是因为这是一门java入门课程,我不想偏离我们到目前为止所涵盖的内容太远。实际上,我知道这不是线性搜索而不是二进制搜索。我认为我们必须坚持二进制搜索,但没有必要。所以我让代码正常工作了。谢谢你们的帮助。