# Objekt nachträglich verändern



## MASTERmind (17. Okt 2007)

Hallo!
Die nachfolgende Klasse instanziiert ein Objekt, das Anzahl Zeilen hält.
Ich verzweifel noch an der Frage, wie ich im Nachhinein also hinterher einfach nur eine Leerzeile oder mehrere hinzufügen zu dem Objekt von außen also aus einer anderen Klasse.

Klasse, dessen Objekt eine Leerzeile/Platzhalter Zeile entahlten soll:



```
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import com.amaris.util.StringUtil;

public class FormattedSpecifications
{ 
  private static final int MAXLENGTH = 30;

  private static final String index_delim = "_"; 

  private String specifications;

  private int partMaxLength;

  private int specificationLength;

  private int minRows;

  private List<String> lines = new ArrayList<String>();
  
  

  public FormattedSpecifications(String specifications)
  {
    this.specificationLength = specifications.length();
    this.specifications = specifications;
  }

  private void calculatePartLength(int rows)
  {
    int rowDigits = String.valueOf(rows).length();

    partMaxLength = MAXLENGTH - index_delim.length() - rowDigits;

    minRows =
        new BigDecimal(specificationLength).divide(new BigDecimal(partMaxLength),
            BigDecimal.ROUND_UP).intValue();
    int minRowDigits = String.valueOf(minRows).length();

    if (minRowDigits > rowDigits)
      calculatePartLength(minRows);
  }

  public int getCountLines()
  {
    return lines.size();
  }

  public String getSpecifications()
  {
    return specifications;
  }

  public void formatInputs(String specifications, int lineCount)
  {
    lines.clear();

    specifications = specifications.replace("¦", "-");

    if (lineCount > 1)
    {
      int start = 0;
      int end = partMaxLength;
      int index = 1;

      while (start < specificationLength)
      {
        String temp =
          specifications.substring(start, end)
                + index_delim
                + StringUtil.getAsZeroFilledString(index++, String.valueOf(
                    lineCount).length());

        lines.add(temp);

        start = end;
        end = Math.min(end + partMaxLength, specificationLength);
      }

      for (; index <= lineCount; index++)
      {
        String temp =

            index_delim
                + StringUtil.getAsZeroFilledString(index, String.valueOf(
                    lineCount).length());
        lines.add(temp);
      }
    }
    else
    {
      lines.add(specifications);
    }
  }

  public List<String> getLines(int rows)
  {
    calculatePartLength(rows);

    formatInputs(specifications, Math.max(rows, minRows));

    return lines;
  }
  
  public List<String> setLines()
  {
    lines.add("testBlablabla");
    return lines;
  }

}
```

Instanziierung der/des Objekts in einer anderen Klasse und hier will ich sowas machen wie setNullLines():

```
// Holen und evtl. formatieren der Merkmale
    for (ResultList.Row row : list)
    {
      // MerkmalsId = lBody.ID
      mId = row.getString(4);
      // Merkmal = lHdr.Text(0) + lSect.Text(2)
      attr = row.getString(0) + "_" + row.getString(2);
      // Technischer Name
      technicalName = row.getString(4) + row.getString(5) + row.getString(6);
      // Objekt instanziieren, das die Daten kapselt
      FormattedAttributes fcd = new FormattedAttributes(mId, attr); 
      // fcd.formatInputs(attr);
      formattedAttributes.add(fcd);
      ///////////////////////////////////////////////////////////
      spec = row.getString(1);
      TechnicalDataIDs tdId = new TechnicalDataIDs(technicalName);      
      techNamesList.add(tdId);
      // //////////////////////////////////////////////////////////
      FormattedSpecifications fcdSpec = new FormattedSpecifications(spec);
      formattedSpecs.add(fcdSpec);
    }
```
Ich bekomme auch die unterschiedlichen Zeilenanzahlen zurück.


----------



## SlaterB (17. Okt 2007)

was funktioniert nicht an sowas wie setNullLines()?
wo ist die Frage bei dem ganzen?

soll man jetzt du Deklaration der Operation und den Aufruf hinschreiben?


----------



## MASTERmind (17. Okt 2007)

Ähm....also eigent,lich dachte ich an sowas wie nen Tipp ...nich gleich pampig werden!

Ist ja auch bisschen schwierig zu beschreiben.
Ich möchte einem 

```
FormattedSpecifications fcdSpec = new FormattedSpecifications(spec);
      formattedSpecs.add(fcdSpec);
```
sagen: fcdSpec.bekommstNochEineZeile() mit einem beliebigen Inhalt.

Und dazu bin ich irgendwie net in der LAge 



			
				SlaterB hat gesagt.:
			
		

> was funktioniert nicht an sowas wie setNullLines()?



Er machts einfach net

Edit:

```
for(int j = 0; j < formattedAttributes.size(); j++)
    {
      int qAttr = formattedAttributes.get(j).getCountLines();
      int qSpec = formattedSpecs.get(j).getCountLines();
      
      if(qAttr > qSpec)
      {
        formattedSpecs.get(j + 1).setLines();
        System.out.println("Anzahl Attribute: " +  qAttr + " " + " Anzahl Spec: " +  qSpec + " Objektnummer: " + j);
        System.out.println(formattedAttributes.get(j).getLines(1));
      }      
    }
```
fügt keine Zeile hinzu....


----------



## SlaterB (17. Okt 2007)

nun, so funktioniert programmieren nicht, 
dass eine Operatsion, die aufgerufen wurde, nicht ausgeführt wird, das gibt es nicht

aber du hast in deinem Code ja weder die Operationsdeklaration noch den Aufruf, wie soll man da etwas dazu sagen?
(das ist nicht pampig sondern direkt  )

schreibe 

 public void setNullLines() 
  { 
  System.out.println("ich mach doch");
  } 

+ Aufruf
System.out.println("gleich mach ich");
fcdSpec.setNullLines();
System.out.println("habs gemacht");


welche von diesen Ausgaben erscheint, welche nicht?

-------

zu deinem edit:
mit Listen und mal get(j), mal get(j+1) brauchst du gar nicht erst anfangen,
suche dir EIN Objekt raus, speichere es irgendwo in einer Variablen 'aktuellesObjekt', dann kann man versuchen etwas damit zu tun,
aber wild in if/else/ Listen, da gehen ja tausend Sachen schief


----------



## MASTERmind (17. Okt 2007)

Edit:


> zu deinem edit:
> mit Listen und mal get(j), mal get(j+1) brauchst du gar nicht erst anfangen,
> suche dir EIN Objekt raus, speichere es irgendwo in einer Variablen 'aktuellesObjekt', dann kann man versuchen etwas damit zu tun,
> aber wild in if/else/ Listen, da gehen ja tausend Sachen schief


==> Verzweiflungstaten!!!!!


alle erscheinen...hab sowas vorher ja schon mal gehabt.
Allerdings muss der List<String>lines eben eine solche Line hinzugefügt werden....und dafür bin ich wohl zu dusselig

```
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import com.amaris.util.StringUtil;

public class FormattedSpecifications
{
  private static final int MAXLENGTH = 30;

  private static final String index_delim = "_";

  private String specifications;

  private int partMaxLength;

  private int specificationLength;

  private int minRows;

  private List<String> lines = new ArrayList<String>();

  public FormattedSpecifications(String specifications)
  {
    this.specificationLength = specifications.length();
    this.specifications = specifications;
  }

  private void calculatePartLength(int rows)
  {
    int rowDigits = String.valueOf(rows).length();

    partMaxLength = MAXLENGTH - index_delim.length() - rowDigits;

    minRows =
        new BigDecimal(specificationLength).divide(
            new BigDecimal(partMaxLength), BigDecimal.ROUND_UP).intValue();
    int minRowDigits = String.valueOf(minRows).length();

    if (minRowDigits > rowDigits)
      calculatePartLength(minRows);
  }

  public int getCountLines()
  {
    return lines.size();
  }

  public String getSpecifications()
  {
    return specifications;
  }

  public void formatInputs(String specifications, int lineCount)
  {
    lines.clear();

    specifications = specifications.replace("¦", "-");

    if (lineCount > 1)
    {
      int start = 0;
      int end = partMaxLength;
      int index = 1;

      while (start < specificationLength)
      {
        String temp =
            specifications.substring(start, end)
                + index_delim
                + StringUtil.getAsZeroFilledString(index++, String.valueOf(
                    lineCount).length());

        lines.add(temp);

        start = end;
        end = Math.min(end + partMaxLength, specificationLength);
      }

      for (; index <= lineCount; index++)
      {
        String temp =

            index_delim
                + StringUtil.getAsZeroFilledString(index, String.valueOf(
                    lineCount).length());
        lines.add(temp);
      }
    }
    else
    {
      lines.add(specifications);
    }
  }

  public List<String> getLines(int rows)
  {
    calculatePartLength(rows);

    formatInputs(specifications, Math.max(rows, minRows));

    return lines;
  }

  public List<String> setLines()
  {
    this.lines.add("testBlablabla");
    return lines;
  }

  public void setNullLines()
  {
    System.out.println("ich mach doch");
  }

}
```


----------



## SlaterB (17. Okt 2007)

> Allerdings muss der List<String>lines eben eine solche Line hinzugefügt werden....

es geht also gar nicht um die Operation setNullLines(), sondern um die Operation setLines() die eigentlich eine neue Zeile einfügt und deshalb addLine() heißen sollte, von der du zwischendurch auch mal in Form von bekommstNochEineZeile() geredet hast?

ich darf solche Fantasienamen verwenden wenn du nix vorgibst,
aber du solltest bei Problembeschreibungen versuchen, konkrete Gegebenheiten anzugeben..

also worum auch immer es aktuell geht (könnte sich im nächsten Posting ja schon wieder ändern..),
nehmen wir mal die setLines()-Operation:

public List<String> setLines() 
  { 
System.out.println("lines before: "+getCountLines());
    this.lines.add("testBlablabla"); 
System.out.println("lines after: "+getCountLines()); // dürfte ja wohl um 1 größer sein
    return lines; 
  } 

klappt doch, was ist das Problem?


----------



## MASTERmind (17. Okt 2007)

Das ist ja das erstaunliche ....es klappt aber der Effekt ist nicht der gewünschte.

Zusammenfassung:
Das Objekt  
	
	
	
	





```
FormattedSpecifications fcdSpec = new FormattedSpecifications(spec);
```
 hält intern eine Liste mit Zeilen. Jetzt möchte ich von außen einem Objekt einfach nur eine weitere Zeile hinzufügen.

Das habe ich jetzt:

```
for (ResultList.Row row : list)
    {
      // MerkmalsId = lBody.ID
      mId = row.getString(4);
      // Merkmal = lHdr.Text(0) + lSect.Text(2)
      attr = row.getString(0) + "_" + row.getString(2);
      // Technischer Name
      technicalName = row.getString(4) + row.getString(5) + row.getString(6);
      // Objekt instanziieren, das die Daten kapselt
      FormattedAttributes fcd = new FormattedAttributes(mId, attr);
      // fcd.formatInputs(attr);
      formattedAttributes.add(fcd);
      // /////////////////////////////////////////////////////////
      spec = row.getString(1);
      TechnicalDataIDs tdId = new TechnicalDataIDs(technicalName);
      techNamesList.add(tdId);
      // //////////////////////////////////////////////////////////
      FormattedSpecifications fcdSpec = new FormattedSpecifications(spec);
      formattedSpecs.add(fcdSpec);
    }

    FormattedSpecifications actObj = formattedSpecs.get(2);
    actObj.setLines();
    System.out.println("j" + actObj.getLines(1));
    formattedSpecs.add(actObj);

    System.out.println("Spezifikationen");
    for (FormattedSpecifications at : formattedSpecs)
    {
      System.out.println(at.getLines(1));
    }
```

Und das kommt raus:
j[5.4 cm]


Da müsste aber 
j[5.4 cm , testblabla stehen]

*kopfQualm*


----------



## SlaterB (17. Okt 2007)

geht es um das actObj-Objekt?
ist denn dieser Aufruf von getLines(1) nötig?

ruf doch mal eine Ausgabe der lines aus ohne
calculatePartLength(rows); 
formatInputs(specifications, Math.max(rows, minRows)); 
zwischendurch (was  getLines(1)) macht,

und zwar vor und nach dem Einfügen, sonst kann man ja eh nix genaues sagen


----------



## MASTERmind (17. Okt 2007)

hab ich gemacht, wenn ich dich richtig verstanden habe!

Ergebnis:
j[testBlablabla]
Spezifikationen
[]
[]
[testBlablabla]
[]
[]
[testBlablabla]


Code FormattedSpecifications:


```
public List<String> getLines(int rows)
  {
    //calculatePartLength(rows);

    //formatInputs(specifications, Math.max(rows, minRows));

    return lines;
  }
```

Edit:
Ohne getLines() bekomme ich nur Referenzen zurück
function.article.FormattedSpecifications@11b9fb1


----------



## SlaterB (17. Okt 2007)

hat das jetzt was mit mir zu tun?
also ich kann aus deinen 8 Ausgaben ohne Informationen, was sie bedeuten (oder gar Code) nichts herauslesen

ich will eine Ausgabe
vor: []
nach: [testBlablabla] 

und wär dann zufrieden, falls dich meine momentane Wunschliste interessiert


----------



## MASTERmind (17. Okt 2007)

Jetzt kapier ich net was Du willst!????? 

Den Quellcode hab ich ja vorher gepostet.
Mein letzter Post war das Ergebnis der Auskommentierung von:

```
public List<String> getLines(int rows)
  {
    //calculatePartLength(rows);

    //formatInputs(specifications, Math.max(rows, minRows));

    return lines;
  }
```
Erkennbar ist, dass die Liste jedes einzelnen Objektes leer sein muss, weil der zu splittende String nicht per auskommentierter Methode übergeben wird!
Daher das Ergebnis.


Ich möchte doch nur die vom instanziierten Objekt der Klasse FormattedSpecifications gehaltene ArrayList per Aufruf aus einer anderen Klasse verändern. Mehr net.


----------



## SlaterB (17. Okt 2007)

> Den Quellcode hab ich ja vorher gepostet. 
> Mein letzter Post war das Ergebnis der Auskommentierung

also gut, dann hast du zwar kein vorher + nachher
(sondern immer noch die Schleife mit so vielen Ausgaben, keine Ahnung wozu),
aber immerhin: nun steht in der einzig interessanten j-Zeile
j[testBlablabla] 

statt vorher
j[5.4 cm] 


also ist das testBlablabla offensichtlich nun drin, 
so wolltest du es doch?

-------

anscheinend entfernt der auskommierte Code testBlablabla wieder,
wie ich es vermutet habe

warum kann ich spontan nicht sagen,
obwohl, sogar ein einfacher Blick brachte sofort

 public void formatInputs(String specifications, int lineCount) 
  { 
    lines.clear(); 
...
}

an so einem     lines.clear();  kann es ja durchaus liegen oder?


----------



## MASTERmind (17. Okt 2007)

@SlaterB: thx...so wie getz is schon fast richtig


----------

