I have a simple object User, with fields like below:
class User {
int id; float size, size2; String username, nickname;
[...]
public float getPercentage() {
return (size - size2); //
}
}
I try to use stream from java 8, but without result. I try to sort by value which is calculated like this: (size - size2). But result is wrong, for this objects. First I create a list:
List<User> users = new ArrayList<>();
users.add(new User(1, "User","nickname", 1.5f, 1.5f));
users.add(new User(1, "User","nickname", 1.5f, 1.2f));
users.add(new User(1, "User","nickname", 1.5f, 1f));
users.add(new User(1, "User","nickname", 1.5f, 1.6f));
users.add(new User(1, "User","nickname", 1.5f, 1.3f));
My comparator looks like this:
Comparator<User> bySizeDifferent = Comparator.comparing(user -> user.getPercentage());
And the I use comparator and display result:
users.stream().sorted(bySizeDifferent).forEach(System.out::println);
After sort result looks like this (the last column is result of subtraction):
1 - User-nickname-1.5-1.5-diff- 0.0- = 0.0
1 - User-nickname-1.5-1.2-diff- 0.2999999523162842-ひく =わ 0.29999995
1 - User-nickname-1.5-1.0-diff- 0.5- = 0.5
1 - User-nickname-1.5-1.6-diff- -0.10000002384185791-ひく =わ -ひく0.100000024
1 - User-nickname-1.5-1.3-diff- 0.20000004768371582-ひく =わ 0.20000005
To see this output method toString() is overrided:
@Override
public String toString() {
return id + " - " + username + "-" + nickname + "-" + size + "-" + size2 + "-diff- " + diff + "- = " + getPercentage();
}
Any advice how solve this?
1 Answer 1
This is what a short, complete program looks like. It puts together all the bits and pieces you provided above, and it works, and sorts as expected. I don't know what you're doing differently, because you never actually provided a short complete program, but this works:
package com.example.dcsohl;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class Comparator8 {
public static class User {
int id; float size, size2; String username, nickname;
public User(int id, String name, String nick, float size, float size2) {
this.id = id;
this.username = name;
this.nickname = nick;
this.size = size;
this.size2 = size2;
}
public float getPercentage() {
return (size - size2);
}
public String toString() {
return id + " - " + username + "-" + nickname + "-" + size + "-" + size2 + "-diff- " + getPercentage();
}
}
public static void main(String...args) {
List<User> users = new ArrayList<>();
users.add(new User(1, "User","nickname", 1.5f, 1.5f));
users.add(new User(1, "User","nickname", 1.5f, 1.2f));
users.add(new User(1, "User","nickname", 1.5f, 1f));
users.add(new User(1, "User","nickname", 1.5f, 1.6f));
users.add(new User(1, "User","nickname", 1.5f, 1.3f));
Comparator<User> bySizeDifferent = Comparator.comparing(user -> user.getPercentage());
users.stream().sorted(bySizeDifferent).forEach(System.out::println);
}
}
Here's the output:
1 - User-nickname-1.5-1.6-diff- -0.100000024
1 - User-nickname-1.5-1.5-diff- 0.0
1 - User-nickname-1.5-1.3-diff- 0.20000005
1 - User-nickname-1.5-1.2-diff- 0.29999995
1 - User-nickname-1.5-1.0-diff- 0.5
2 Comments
User constructor, for example ... for all I know, he's giving size and size2 the same value by accident. And his toString() mentioned a variable, diff, that wasn't mentioned anywhere else. I ignored it in my code, but who knows what it does in the OP's code?
Comparator? We have no way to tell.forEachOrderedinstead offorEach.