Я весь день боролся за эту простую функцию, но я не могу заставить ее работать так, как хотелось бы. Сначала это может показаться простым, и в Переполнении стека действительно есть еще одна запись, в которой об этом говорится. Тем не менее, все становится грязным, когда вводятся скобки. Допустим, мы можем получить алгоритм для кубика Рубика, который будет выглядеть примерно так: (RUR 'U) U' (RU 'R') Важно отметить, что после каждого хода, имеет ли он "" "или нет, это пробел, за исключением тех, которые находятся перед скобками. Теперь для каждого алгоритма в кубике Рубика существует его обратный алгоритм, который отменяет его. Например, обратное значение R - это R ', а U - это U, а обратное к RU - это U' R '. Таким образом, обратный пример этого примера: (RU R ') U (U' RU 'R') Также важно отметить, что существует много ходов (F, B, D, U, u, f, M, S , x, y, z ...) Кроме того, у каждого alg есть свой обратный (R имеет R 'и наоборот. Можете ли вы получить какую-либо функцию в Java для этого? Я пробовал бесконечные циклы ifelse, for, switch. .. Я оставлю некоторые из моих попыток только для справки
String fullAlg = text.toString() + " ";
String reversedAlg = "hh";
int numSpaces = 1;
int pos1 = 0, pos2 = 0;
for (int i = 0; i < text.length(); i++) {
if (text.charAt(i) == ' ' && numSpaces == 0) {
numSpaces++;
pos1 = i;
}
if (text.charAt(i) == ' ' && numSpaces == 1) {
numSpaces++;
pos2 = i;
}
if (numSpaces == 2) {
if (fullAlg.substring(pos1, pos2).matches("[a-zA-Z]+")){
Toast.makeText(this, "YES", Toast.LENGTH_SHORT).show();
}
switch (fullAlg.substring(pos1, pos2)) {
//Begin with (
case "(" + "[a-zA-Z]+":
reversedAlg += ")'" + fullAlg.substring(pos1, pos2).charAt(1);
break;
case "(" + "[a-zA-Z]+" + "\'":
reversedAlg += ")" + fullAlg.substring(pos1, pos2).charAt(1);
break;
case "(" + "[a-zA-Z]+" + "2":
reversedAlg += ")2" + fullAlg.substring(pos1, pos2).charAt(1);
break;
//No ()
case "[a-zA-Z]+":
reversedAlg += " '" + fullAlg.substring(pos1, pos2).charAt(0);
break;
case "[a-zA-Z]+" + "\'":
reversedAlg += " '" + fullAlg.substring(pos1, pos2).charAt(0);
break;
case "[a-zA-Z]+" + "2":
reversedAlg += " 2" + fullAlg.substring(pos1, pos2).charAt(0);
break;
//End with )
case "[a-zA-Z]+" + ")":
reversedAlg += " '" + fullAlg.substring(pos1, pos2).charAt(1) + "(";
break;
case "[a-zA-Z]+" + "\'" + ")":
reversedAlg += " " + fullAlg.substring(pos1, pos2).charAt(1) + "(";
break;
case "[a-zA-Z]+" + "2" + ")":
reversedAlg += " )2" + fullAlg.substring(pos1, pos2).charAt(1) + "(";
break;
//Encapsulated in ()
case "(" + "[a-zA-Z]+" + ")":
reversedAlg += " )'" + fullAlg.substring(pos1, pos2).charAt(1) + "(";
break;
case "(" + "[a-zA-Z]+" + "\'" + ")":
reversedAlg += " )" + fullAlg.substring(pos1, pos2).charAt(1) + "(";
break;
case "(" + "[a-zA-Z]+" + "2" + ")":
reversedAlg += " )2" + fullAlg.substring(pos1, pos2).charAt(1) + "(";
break;
}
numSpaces = 0;
}
}
StringBuilder returnAlg = new StringBuilder(reversedAlg).reverse();
algTV.setText(fullAlg.substring(pos1, pos2));
}
Или этот
String fullAlg = text.toString();
String fullAldReversed = "";
int posStart = 0, posEnd = 0;
for (int i = 0; i < fullAlg.length(); i++) {
if (fullAlg.charAt(i) == '('){
posStart = i;
} else if (fullAlg.charAt(i) == ')'){
posEnd = i;
fullAldReversed += "(" + reverseAlg(fullAlg.substring(posStart, posEnd)) + ")";
posStart = 0;
}
}
if (posEnd == 0){
fullAldReversed = "" + reverseAlg(fullAlg);
}
algTV.setText(fullAldReversed);
}
private StringBuilder reverseAlg(CharSequence text) {
StringBuilder builder;
if (!(text.charAt(0) == ' ' || text.charAt(text.length() - 1) == ' ')) {
builder = new StringBuilder(text + " ");
} else {
builder = new StringBuilder(text);
}
int subStart = 0;
StringBuilder auxBuilder;
String substring = "", auxString = "";
for (int i = 0; i < builder.length(); i++) {
substring = "";
int subEnd = i;
int identifierMove = 0;
for (int j = subStart; j <= subEnd; j++) {
if (builder.charAt(j) == '\'')
identifierMove = 1;
else if (builder.charAt(j) == '2')
identifierMove = 2;
else if (identifierMove == 0)
identifierMove = 3;
}
String letterMove;
switch (identifierMove) {
case 1:
letterMove = builder.substring(subStart, subEnd - 1);
subStart = subEnd + 1;
substring = " " + letterMove;
break;
case 2:
letterMove = builder.substring(subStart, subEnd - 1);
subStart = subEnd + 1;
substring = " 2" + letterMove;
break;
case 3:
letterMove = builder.substring(subStart, subEnd);
subStart = subEnd + 1;
substring = " '" + letterMove;
break;
}
auxString += substring;
}
auxBuilder = new StringBuilder(auxString);
auxBuilder.reverse().toString();
return auxBuilder;
}
Спасибо !!