HP Forums
Best way to sort one list based on another? - Printable Version

+- HP Forums (https://www.hpmuseum.org/forum)
+-- Forum: HP Calculators (and very old HP Computers) (/forum-3.html)
+--- Forum: HP Prime (/forum-5.html)
+--- Thread: Best way to sort one list based on another? (/thread-4294.html)



Best way to sort one list based on another? - BruceH - 07-04-2015 10:40 AM

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?


RE: Best way to sort one list based on another? - roadrunner - 07-04-2015 02:52 PM

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


RE: Best way to sort one list based on another? - DrD - 07-04-2015 06:51 PM

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;



RE: Best way to sort one list based on another? - StephenG1CMZ - 07-04-2015 08:00 PM

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?


RE: Best way to sort one list based on another? - BruceH - 07-04-2015 09:53 PM

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.


RE: Best way to sort one list based on another? - Tyann - 07-05-2015 06:03 AM

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)


RE: Best way to sort one list based on another? ANSWERED - BruceH - 07-05-2015 07:34 AM

For those finding this thread in the future, the best answer is here.


RE: Best way to sort one list based on another? - Tyann - 07-05-2015 06:27 PM

thank you ,nice response