Алгоритм приведения строки к упорядоченному виду java?
Есть строка: в java:
String MyString = "|0|17|19|20|17|0|";
Вопрос: как вывести на экран (в консоль) строку в другом формате ,а именно, должно все быть по порядку проиндексировано ,а именно,
MyString = "0|1|2|3|1|0";
Если число в строке впервые встречается то нужно его записать как 0, а дальше, по порядку нумерации (ряда натуральных чисел). Не минусуйте, я только что вышел из минуса, просто дайте совет, как реализовать это, может быть я не знаю точное название проблемы, и т.п. и т.д.
package j;
public class Main {
public static void main(String[] args) {
String MyString = "|0|17|19|20|17|0|";
<Помощь зала знатоков>
<Помощь зала знатоков>
<Помощь зала знатоков>
<Помощь зала знатоков>
<Помощь зала знатоков>
System.out.println(MyString+"");
}
}
Ответы (3 шт):
String myString = "|0|17|19|20|17|0|";
Map<String, Integer> rankMap = new HashMap<>();
int maxRank = 0;
String res = "";
for (String s : myString.split("\\|")) {
if (s.isEmpty()) {
continue;
}
int rank;
if (rankMap.containsKey(s)) {
rank = rankMap.get(s);
} else {
rank = maxRank;
maxRank++;
rankMap.put(s, rank);
}
res += (res.isEmpty() ? "" : "|") + rank;
}
System.out.println(res); // 0|1|2|3|1|0
Заменил словарь из соседнего ответа на массив, получилось следующее
String myString = "|0|17|19|20|17|0|";
int[] indexes = new int[256];
for (int i = 0; i < indexes.length; i++) indexes[i] = -1;
String res = "";
int current = 0;
for (String s : myString.split("\\|")) {
if (s.isEmpty()) {
continue;
}
int value = Integer.parseInt(s);
int index = indexes[value];
if (index < 0) {
index = current;
indexes[value] = current;
current++;
}
res += (res.isEmpty() ? "" : "|") + index;
}
System.out.println(res);
Вот что получилось, то мне и нужно, спасибо @tym32167 и @Кирилл Малышев;
Дано: 0/17/19/20/17/0/22/255/20
Вывод: 0/1/2/3/1/0/4/5/3
package j;
public class J1 {
public static void main(String[] args) {
mySort0( "0/17/19/20/17/0/22/255/20", "/");
}
public static void mySort0(String MyWord, String MyDelimiter){
String de=MyDelimiter;
String myString = MyWord;
int[] indexes = new int[256];
for (int i =0; i < indexes.length; i++) indexes[i] = -1;
String res = "";
int current = 0;
String s[] = myString.split(de);
for(int i=0;i<=s.length-1;i++){
int value = Integer.parseInt(s[i]);
int index = indexes[value];
if (index < 0) {
index = current;
indexes[value] = current;
current++;
}
//res = res + de + index;
if("".equals(res)){res=index+"";}
else {res = res+ de+ index;}
}
System.out.println("MyInputWord: "+MyWord);
System.out.println("MyOutWord:" +res);}
}