我需要找到一个算法来计算任何字符串中的字母(例如“cabababb”),输出必须按字母顺序排列(例如a:3,b:4,c:1等)。无需区分大写和小写字母。我不被允许你使用HashMap。
这是我的代码,直到现在:我没有工作,我想我在这里有错误的策略。你能帮帮我吗?
public class Stringray extends MiniJava{
public static void main(String[] args) {
// Texteingabe
String input = readString("Geben Sie einen Text ein: ");
String output = "";
int i = 0;
// Häufigkeit der Buchstaben
int count = 0;
char letter = 'a';
while(i < input.length()) {
while(i < input.length()) {
if(input.charAt(i) == letter) {
while(i < input.length()) {
count++;
i++;
}
output = output + letter + ": " + count + "\t";
}
i++;
}
letter++;
}
write(output);
}
}
答案 0 :(得分:2)
这是一个简单的算法:
int[]
的空26
数组,它将使用0
s进行初始化char
。char
及其相应的索引之间进行映射(例如a
将是索引0
,b
将是索引1
} 等等)。看看这个0
的值以及该索引处的相应char
(此处再次需要ASCII映射)答案 1 :(得分:1)
在线性时间内执行此操作的一种非常有效的方法是使用HashMap
public class Stringray extends MiniJava {
public static void main(String[] args) {
String input = "Geben Sie einen Text ein: ";
System.out.println(countLetters(input));
}
public static HashMap<Character, Integer> countLetters(String input) {
HashMap<Character, Integer> hashMap = new HashMap<>();
final int length = input.length();
for (int i = 0; i < length; i++) {
Character currentChar = Character.toLowerCase(input.charAt(i));
if (Character.isAlphabetic(currentChar)) {
if (hashMap.containsKey(currentChar)) {
hashMap.put(currentChar, hashMap.get(currentChar) + 1);
} else {
hashMap.put(currentChar, 1);
}
}
}
return hashMap;
}
}
您需要考虑大写和小写相同并丢弃非字母字符。一旦掌握了hashmap中的所有信息,您显示控制台的方式就是另一回事。如果你需要为文本中不存在的字母显示零,那么最好将hashmap初始化为。
答案 2 :(得分:1)
我不确定这是否是一个棘手的问题。但实际上你需要做的就是创建一个计算String中字符出现次数的方法。下面的代码如何做到这一点是最简单的方法。我留给你修改它,使它适合你所有的测试用例。
public static void main(String[] args)
{
String input = "cabababb";
char[] testCharacters = new char[] { 'a', 'b', 'c' };
for (int i = 0; i < testCharacters.length; i++)
{
System.out.println(testCharacters[i] + " occurs " + countOccurencesOf(testCharacters[i], input));
}
}
public static int countOccurencesOf(char aCharacter, String inThisString)
{
int count = 0;
for (int i = 0; i < inThisString.length(); i++)
{
if (aCharacter == inThisString.charAt(i)) { count++; }
}
return count;
}
答案 3 :(得分:1)
我为你准备了一个炭泡泡排序。使用内置的排序方法,还有其他方法可以用更少的代码完成此操作,但是这个方法显示了数组排序的工作方式。
这不会考虑大写和小写字母会改变它们的数字Unicode值,但这会让你朝着正确的方向前进。
public static void main(String[] args) {
char[] str = "cabababb".toCharArray(); //Turn your string into an array
int n = str.length; //get the length of the array
char temp; //a temporary character holder
for (int i = 0; i < n; i++) {
for (int j = 1; j < (n - i); j++) {
int compare = Character.getNumericValue(str[j - 1]);//get the numeric value of the char
int compareTo = Character.getNumericValue(str[j]); //etc
if (compare > compareTo) {//do a compare
//swap elements
temp = str[j - 1]; //bubble sort
str[j - 1] = str[j];
str[j] = temp;
}
}
}
System.out.println(Arrays.toString(str));//You get your sorted array
}
冒泡排序背后的概念是这样的:
如果你的数组是[&#39; x&#39;,&#39; j&#39;]
如果前一个数组迭代大于当前数组迭代,这两个变量将进入带有注释//do a compare
的if语句:
回到这个例子:
[&#39; X&#39;&#39; J&#39]
if('x' > 'j'){//for example's sake **Not real code**
//x is in 0 position
//j is in 1 position
temp = 0 position's value;
0 position's value = 1 position's value;
1 position's value = temp;
}
最后,您将获得一个按字母顺序排列的数组。
如果你需要它回到一个字符串,你可以将它连接回一个字符串
String newStr = "";
for(char letter : str){
newStr += letter;
}
System.out.println(newStr);
我希望这有助于您理解Java中排序背后的概念
答案 4 :(得分:1)
您可以按照QBrute正确指出的以下步骤解决问题。
public String countMatches(String main) {
//Create an array of the alphabets length
main = main.toLowerCase();
int[] foundArray = new int[26];
String output = "";
//Create an alphabets array
String[] alphabets = "a b c d e f g h i j k l m n o p q r s t u v w x y z".split("\\s");
//Split the main String array
String[] mainArray = main.split("");
for (String string : mainArray) {
//Iterate through the array
for (int i = 0; i < alphabets.length; i++) {
//If the string index matches any of our alphabets
if (string.equals(alphabets[i])) {
//Increase the corresponding foundArray index value
foundArray[i] = foundArray[i] + 1;
}
}
}
//Iterate through the foundArray
for (int i = 0; i < foundArray.length; i++) {
//If an index is greater than 0
if (foundArray[i] > 0) {
//A match was found
//Assign the matched foundArray index to the corresponding alphabet
output += alphabets[i] + ":" + foundArray[i] + ", ";
}
}
return output;
}
答案 5 :(得分:0)
要求需要一些分析。
有一个非功能性要求不使用哈希映射。哈希映射只是一种以牺牲一点时间为代价来减少稀疏数据的存储需求的方法。它易于使用,但在Java中使代码更复杂一些。所以,直截了当的方法是使用数组。记忆很便宜,希望如此。
功能要求更成问题:
int[] codepointCounts = new int[Character.MAX_CODE_POINT + 1]; // min to max, inclusive
String input = "Häufigkeit der Buchstaben";
for(int c : input.codePoints().toArray()){
codepointCounts[c]++;
}
for (int c = Character.MIN_CODE_POINT; c <= Character.MAX_CODE_POINT; c++) {
if (codepointCounts[c] > 0) {
if (Character.isLetter(c)) {
write(
new String(Character.toChars(c)) + '\t' +
codepointCounts[c] + '\t' +
Character.getName(c));
}
}
}
答案 6 :(得分:0)
所以我完成了我的程序,控制台上没有任何内容 - 为什么???
我现在的代码如下所示:
public class Stringray extends MiniJava{
public static void main(String[] args) {
// Text input
String input = readString("Geben Sie einen Text ein: ");
// Main menu
int choose = readInt("Geben Sie 1 für Buchstabenanzahl, 2 für Buchstabenersetung und 3 für Wortspiegelung ein:");
while(choose != 1 && choose != 2 && choose != 3) {
write("Eingabe ungültig.");
choose = readInt("Geben Sie 1 für die Häufigkeit der Buchstaben, 2 für Buchstabenersetung und 3 für Wortspiegelung ein:");
}
// Execute choice
if(choose == 1) {
countMatches(input);
}if(choose == 2) {
change(input);
}
String[] inPut = input.split(" ");
reflect(inPut);
}
// Count letters
public static String countMatches(String main) {
int[] foundArray = new int[26];
String output = "";
String[] alphabets = "a b c d e f g h i j k l m n o p q r s t u v w x y z".split("\\s");
for (String string : main.split("")) {
for (int i = 0; i < alphabets.length; i++) {
if (string.equals(alphabets[i])) {
foundArray[i] = foundArray[i] + 1;
}
}
}
for (int i = 0; i < foundArray.length; i++) {
if (foundArray[i] > 0) {
output += " " + alphabets[i] + ":" + foundArray[i] + ", ";
}
}
return(output);
}
// Replace letters
public static String change(String text) {
write("Geben Sie zweimal nacheinander je einen Buchstaben ein.");
String inputOne = readString("Erster Buchstabe:");
String inputTwo = readString("Zweiter Buchstabe:");
while(inputOne.length() != 1 || inputTwo.length() != 1) {
write("Falsche Eingabe, bitte geben Sie zweimal nacheinander je einen Buchstaben ein.");
inputOne = readString("Erster Buchstabe:");
inputTwo = readString("Zweiter Buchstabe:");
}
int i = 0;
char one = inputOne.charAt(0);
char two = inputTwo.charAt(0);
char input = text.charAt(i);
while(i < text.length()) {
if(input == one) {
input = two;
}
i++;
}
String output = text;
return(output);
}
// Mirror words
public static String[] reflect(String [] feld) {
String[] reflect = new String [feld.length];
int j = feld.length-1;
for(int i = 0; i < feld.length; i++) {
reflect[i] = feld[j];
j--;
}
return reflect;
}
提前感谢您的大力帮助!