Home > Net >  Sort specific parts in String
Sort specific parts in String

Time:01-29

Alright so, I have a String which contains: 1 456 2 100 3 600 1 400

The 1 is the Id of a person which got a score of 456 and 400. 2 is the Id of a person which got a score of 100 etc.

I need the String to sort by values and not by id's. It should look like this: 2 100 1 400 1 456 3 600

I already tried putting it into a hashmap and sorting it, but since a hashmap doesn't take identical keys, this is not an option.

CodePudding user response:

Here is the full snippet, but as WJS commented, create a class:

public class Person {
    private String id;
    private int score;
    ...
}

Then add these to a List:

...
String[] parts = s.split(" ");
    
List<Person> people = new ArrayList<>();
for (int i = 0; i < parts.length; i  = 2) {
    String id = parts[i];
    int score = Integer.parseInt(parts[i 1]);
    people.add(new Person(id, score));
}

Then you sort the list by passing a comparator which compares scores and if you need it back in a String, join the list with spaces:

people.sort((p1, p2) -> Integer.compare(p1.score, p2.score));    
String result = people.stream().map(Person::toString).collect(Collectors.joining(","));

CodePudding user response:

Ok, here is how I did it. I used a record instead of a class as it creates the getters implicitly. No setters since a record is immutable.

record and data string

record Data (int id, int score) {
  @Override
  public String toString() {
      return"id=%d, score=%d".formatted(id, score);
  }
}
String data = "1 456 2 100 3 600 1 400";
  • create the list to hold the data
  • split on one or more white space characters
  • then for each (id, score) pair, create an instance of Data (I converted both to ints)
  • add the instance to the list
  • and sort the list
List<Data> list = new ArrayList<>();
String[] items = data.split("\\s ");
for(int i = 0; i < items.length; i =2) {
    list.add(new Data(Integer.parseInt(items[i]), Integer.parseInt(items[i 1])));
}
list.sort(Comparator.comparingInt(Data::value));
for (Data d : list) {
    System.out.println(d);
}

prints

id=2, score=100
id=1, score=400
id=1, score=456
id=3, score=600


  • Related