Алгоритм приведения строки к упорядоченному виду 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
→ Ссылка
Автор решения: tym32167

Заменил словарь из соседнего ответа на массив, получилось следующее

    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);
→ Ссылка
Автор решения: Arthur Alunts

Вот что получилось, то мне и нужно, спасибо @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);}


}
→ Ссылка