Micha Wiedenmann
Micha Wiedenmann

Reputation: 20843

Howto transform each set of two elements of a source list into a transformed list?

I have a List<String> with elements like:

"<prefix-1>/A",
"<prefix-1>/B",
"<prefix-2>/A",
"<prefix-2>/B",
"<prefix-3>/A",
"<prefix-3>/B",

that is, for every <prefix>, there are two entries: <prefix>/A, <prefix>/B. (My list is already sorted, the prefixes might have different length.)

I want the list of prefixes:

"<prefix-1>",
"<prefix-2>",
"<prefix-3>",

What is a good way to transform a source list, when multiple (but always a constant amount of elements) correspond to one element in the transformed list?

Thank you for your consideration

Upvotes: 0

Views: 84

Answers (4)

Suresh Atta
Suresh Atta

Reputation: 121998

public List<String> getMyList(prefix){
List<String> selected= new ArrayList<String>();

for(String s:mainList){
    if(s.endsWith(prefix.toLower())) // or .contains(), depending on 
        selected.add(s);     // what you want exactly 
}

return selected;

}

Upvotes: 0

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 726639

Here is a solution that does not change the order of prefixes in the result. Since the elements are pre-sorted, you can take elements until you find a prefix that differs from the last taken element, and add new elements to the result, like this:

List<String> res = new ArrayList<String>();
String last = null;
for (String s : src) {
    String cand = s.substring(0, s.lastIndexOf('/'));
    // initially, last is null, so the first item will always be taken
    if (!cand.equals(last)) {
        // The assignment of last happens together with addition.
        // If you think it's not overly readable, you can move it out.
        res.add(last = cand);
    }
}

Here is a demo on ideone.

Upvotes: 1

Tilo
Tilo

Reputation: 3325

If the number if structurally similar elements is always the same, then you cam just loop over the beginning of the list to find out this number, and then skip elements to construct the rest.

Upvotes: 0

PaulProgrammer
PaulProgrammer

Reputation: 17630

If the prefixes are always a constant length, you can trim them out and put them into a Set:

List<String> elements = // initialize here
Set<String> prefixes = new HashSet<String>();
for( String element : elements) {
    String prefix = element.substring(0,"<prefix-n>".length());
    prefixes.add(prefix);
}
// Prefixes now has a unique set of prefixes.

You can do the same thing with regular expressions if you have a variable length prefix, or if you have more complex conditions.

Upvotes: 3

Related Questions