crs.one: Vereinfachung folgender Abfrage

tach auch...

bin an dem punkt angelangt, an dem ich einfach den wald vor lauter bäumen nicht mehr sehe ;)

ich würde gerne wissen ob jemand eine vereinfachung in dieser abfrage findet:

------------------------------------------------------------------
if((runner == anfang) || ((runner != anfang) && (runner != ende)))
{
  runner.get_next().set_last(runner.get_last());
}
else
{
  ende = runner.get_last();
}
if((runner == ende) || ((runner != anfang) && (runner != ende)))
{
  runner.get_last().set_next(runner.get_next());
}
else
{
  anfang = runner.get_next();
}
------------------------------------------------------------------

es liegt wahrscheinlich direkt auf der hand, doch schau ich mir diesen code-schnippel einfach schon zu lange an und hoffe nun auf den rat und die augen einiger dritter.
der OR-part der beiden if-abfragen ist ja identisch und daher sollte es irgendwie möglich sein, diese beiden zu kombinieren.

hinweis:

es handelt sich um eine doppelt verkettete dynamische listenstruktur in java bei der ich einen anfangs- und end-"zeiger" verwende.
nun sollen beim löschen die "zeiger"-strukturen umgestellt werden und beim löschen des ersten bzw. letzten elementes dabei noch der anfangs- bzw. end-"zeiger" versetzt werden.

thx für eure zeit, mühe und guten augen ;)

greez

crs

  1. Hallo,

      
    if(runner!=ende){  
       runner.get_next().set_last(runner.get_last());  
    }  
    else{  
       ende=runner.get_last();  
    }  
    if((runner==ende) || (runner!=anfang)){  
       runner.get_last().set_next(runner.get_next());  
    }  
    else{  
       anfang=runner.get_next();  
    }  
    
    

    Gruß aus Berlin!
    eddi

    --
    Achte die Kleinigkeiten, aber liebe das Detail!
    1. hey vielen dank eddi...

      schönen gruß zurück aus dem rheinland.

      crs

    2. gudn tach!

      deine erste vereinfachung setzt voraus, dass anfang!=ende gilt (die zweite aber nicht).
      mit dieser voraussetzung (anfang!=ende) ginge es dann noch einfacher:

        
      if(runner!=ende)  
        runner.get_next().set_last(runner.get_last());  
      else  
        ende=runner.get_last();  
      if(runner!=anfang)  
         runner.get_last().set_next(runner.get_next());  
      else  
         anfang=runner.get_next();
      

      (runner!=anfang) erlaubt ja auch (runner==ende), falls (anfang!=ende).

      man kann solche probleme uebrigens mit einer kleinen tabelle loesen

      werte fuer | runner==ende ||
      runner     | (runner!=ende &&
      (disjunkt) |  runner!=anfang)
      -----------+-----------------
      anfang     | 0
      ende       | 1
      else       | 1

      also waere die vereinfachung des ausdrucks: (runner!=anfang)

      falls auch anfang==ende gelten koennte, wuerde die tabelle etwas komplizierter:

      werte fuer                    | runner==ende ||
      runner                        | (runner!=ende &&
      (disjunkt)                    |  runner!=anfang)
      ------------------------------+-----------------
      anfang (aber nicht ende)      | 0
      ende (und nicht anfang)       | 1
      anfang (==ende)               | 1
      else (weder anfang noch ende) | 1

      und als ausdruck wuerde sich (runner!=anfang || runner==ende) ergeben.

      eine andere moeglichkeit, die aber nicht jedem leichter faellt, ist das umformen:

      r=runner, a=anfang, e=ende

      (r==a) || ((r!=a) && (r!=e))
      <=> ((r==a) || (r!=a)) && ((r==a) || (r!=e))
      <=>        true        && ((r==a) || (r!=e))
      <=>                       ((r==a) || (r!=e))
      eigentlich fertig. falls jedoch (a!=e) vorausgesetzt wird, kann man noch einen schritt weiter umformen:
      <=> (fuer a!=e)           (r!=e)

      auf der sicheren seite ist man also mit:

        
      if(runner==anfang || runner!=ende)  
        runner.get_next().set_last(runner.get_last());  
      else  
        ende=runner.get_last();  
      if(runner==ende || runner!=anfang)  
         runner.get_last().set_next(runner.get_next());  
      else  
         anfang=runner.get_next();
      

      prost
      seth

      1. moin...

        danke für diese echt detailierte und hilfreiche erklärung seth.
        mit dieser allgemein gültigen form lässt sich echt alles minimalisieren. echt klasse.

        schönen tag noch

        crs