HP Forums

Full Version: Best way to sort one list based on another?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I have two lists

name := { "Bird", "Jordan", "O'Neal" }
height := { 2.06, 1.98, 2.16 }

and I want to sort the names into height order. What's the best way to do this in HP PPL, please?
I couldn't find any way to do it except the brute force method:

Code:

EXPORT sortlists(List1,List2)
BEGIN
 local i,j,temp, Size;
 Size:=size(List1);
 if Size <> SIZE(List2) then 
  print("lists are not the same size");
 end;
 for i from 1 to Size do
  for j from 1 to Size−1 do
   if List1(j) < List1(j+1) then
    temp:=List1(j);
    List1(j):= List1(j+1);
    List1(j+1):=temp; 
    temp:=List2(j);
    List2(j):=List2(j+1);
    List2(j+1):=temp;
   end;
  end;
 end;
 return {List1,List2};
END;

[attachment=2265]

There is probably a better way, but this at least works.

Road
Code:

EXPORT parallel_List_sort()
BEGIN
  local name := { "Bird", "Jordan", "O'Neal" }, height := { 2.06, 1.98, 2.16 };

  for I from 1 to length(height) do
    for J from I+1 to length(height) do
      if height(I) > height(J) then 
        L0:=height(I);L1:=name(I);
        name(I):=name(J); height(I):=height(J);
        name(J):=L1(1);height(J):=L0(1);
      end;
    end;     
  end;

  print();
  print(name);
  print(height);
END;
There isn't a PPL built-in function to list in using another list as a key.
As others have suggested one can write your own sort function.

However, the Prime appears to have built-in buttons that can do something very similar for spreadsheet columns and to three columns of statistical data. And it can turn lists into columns.

These built-in features might be of some use if you wanted to avoid writing your own sort function - but they cannot be accessed from the PPL as far as I know.

It seems a pity that spreadsheets and statistical apps can do such a sort, but lists and the PPL cannot (or have I missed something?)

Perhaps this could be added in a future PPL?
Okay, here's a quick & dirty effort[1]:
Code:
EXPORT name := { "Bird", "Jordan", "O'Neal" };
EXPORT height := { 2.06, 1.98, 2.16 };

EXPORT SORTB(a,b)
BEGIN
  LOCAL c, i, p;
  c := EXECON("&2+CHAR(28)+&1", a, b);
  c := SORT(c);
  FOR i FROM 1 TO SIZE(c) DO
    p := INSTRING(c(i), CHAR(28));
    c(i) := MID(c(i), p+1);
  END;
  RETURN c;
END;

Call as: SORTB(name, height)

[1] It's not perfect - two people with the same height will be sorted by name as well.
Hello
I suggest
Code:

Ecart(n)
BEGIN
LOCAL u;
WHILE u<n DO
 u:=3*u+1;
END;
(u-1)/3;
END;

EXPORT SORTM(o)
BEGIN
 LOCAL f,i,j,d,n;
 LOCAL e,k,l,z,p,s;
 IF TYPE(o[1])==6 THEN
  l:=o[1];f:=1; 
 ELSE
  l:=o; 
 END;
 d:=SIZE(l);
 k:=MAKELIST(I,I,1,d);
 p:=Ecart(d);
 WHILE p>0 DO
  FOR i FROM p+1 TO d DO
   e:={l[i],k[i]}; 
   j:=i;s:=1;
   WHILE j>p  AND s DO
    IF l[j-p]>e[1] THEN
     l[j]:=l[j-p];k[j]:=k[j-p];
     j:=j-p;
    ELSE
     s:=0;
    END;
   END;
   l[j]:=e[1];k[j]:=e[2];
  END; 
  p:=iquo(p,3);
 END;
 IF f THEN
  o[1]:=l;n:=SIZE(o);
  FOR i FROM 2 TO n DO
   z:=SIZE(o[i]);l:={};
   FOR j FROM 1 TO d DO
    l[j]:=o(i,k[j]);
   END;
   o[i]:=IFTE(z>d,CONCAT(l,SUB(o[i],j,z)),l);
  END; 
  o; 
 ELSE
  {l,k};
 END;
END;
SORTM({5,2,3,1}) return {{1,2,3,5},{4,2,3,1}}
SORTM({{5,2,3,1},{100,200,300,400},{"A","B","C","D"}}) return {{1,2,3,5},{400,200,300,100},{"D","B","C","A"}}
SORTM({{5,2,3,1},{100,200,300},{"A","B","C","D"}}) return Erreur
SORTM({{5,2,3,1},{100,200,300,400},{"A","B","C","D","X","H"}}) return {{1,2,3,5},{400,200,300,100},{"D","B","C","A","X","H"}}

Hoping that it will be useful.
Sorry for my English (Google traduction)
For those finding this thread in the future, the best answer is here.
thank you ,nice response
Reference URL's