vektor bearbeiten??

  • Themenstarter Themenstarter adlerman
  • Beginndatum Beginndatum
A

adlerman

Gast
Hallo!!!!!
ich sitze an einer Aufgabe in der ich eure hilfe benötige. gegeben sei ein
vektor mit denn Werten x=[0 0 0 10 10 10 0 0 7 7 0 0 0 0 54 54 54]
ich möchte das gerne mit einer for schleife durchlaufen und in dann so ausgeben
y=[0 0 0 1 1 1 0 0 2 2 0 0 0 0 3 3 3 ]

[Java]for (int i = 0; i < x.length; i++) {
if (x!=0);
y[count]=count;
count++;
}[/Java]
Die Werte im Vektor x sind Grauwerte in einem Bild, und ich möchte diese nach der Reihenfolge setzen.
 
Hey

zuerst mal sollte man die Klasse Vector nicht mehr verwenden sondern als Alternative die Klassen aus dem Collection-Framework, dies sind z.B. ArrayList oder LinkedList (einfach mal googeln).

Weiter verstehe ich deine Frage nicht ganz möchtest du die "Liste" x nach der grösse sortieren?
 
die werte z.B. 10 oder 7 etc. sind grauwert regionen in einem bild, ich möchte diesen array x so setzen das die regionen nicht 10 etc. sondern 1, 2,3 ...sind

also sprich alle werte mit 10 gleich 1 und alle mit 7 gleich 2 usw.
die regionen sollen also sortiert werden.
 
Kommen zwischen den Bereichen immer 0en vor? Dann könnte man den Vector durchlaufen und dabei zwei Merker verwenden. In einem merkt man sich bzw. erhöht man die Bereichsnr im anderen merkt man sich zwecks Vergleich die zuletzt gefundene Zahl ungleich 0. Stosst man beim Durchlaufen auf eine Zahl ungleich 0 prüft man mit Merker1 ob die selbe Zahl bereits zuvor gefunden wurde. Falls ja ersetzt man den Eintrag durch den Zähler in Merker2 falls nein erhöht man Merker2 um eins merkt sich die Zahl in Merker1 und ersetzt anschliessend die Zahl durch Merker2.
 
Ja genau ,es kommen auch Nullen vor. Ist mein Code oben soweit ok, um es so weiter zu implementieren wie du es grad gepostet hast?
 
soll bei [c]x=[0 0 10 10 0 4 4 0 0 0 10][/c] dann [c]y=[0 0 1 1 0 2 2 0 0 0 1][/c] oder [c]y=[0 0 1 1 0 2 2 0 0 0 3][/c] rauskommen?

Edit:
Es spricht eigentlich für den ersten Fall, da die Nullen auch immer als Null betitlet werden. Ausser sie sind ein Sonderfall. Wenn 0 kein Sonderfall ist, dann müsste [c]x=[10 0 4][/c] [c]y=[0 1 2][/c] ergeben!? Ansonsten natürlich [c]y=[1 0 2][/c].
Bitte etwas genauer angeben 😉

@Michael...: es spielt doch überhaupt keine Rolle, ob immer Nullen dazwischen vorkommen!?
 
Zuletzt bearbeitet:
@adlerman
Weiter unten ist die Lösung (keien Garantie dass er optimal oder lauffähig ist^^), also nur weiterlesen, wenn dus nicht selbst schaffst ;-)

edit: Falls ein Gebiet doppelt vorkommen kann, dann stimmt die Lösung natürlich nicht mehr...
edit2: Hab`grad festgestellt, dass noch ein Fehler dabei ist. Falls das erste Element im x-Array keine 0 ist, wird das Gebiet '0' anstatt '1' zugewiesen. Der Fehler liegt in der Zeile:
Java:
int lastArea = x[0];
Java:
if (x[i] != lastArea)

Java:
        int[] x = {0, 0, 0, 10, 10, 10, 0, 0, 7, 7, 0, 0, 0, 0, 54, 54, 54};
        int[] y = new int[x.length];
        int currentArea = 0;
        int lastArea = x[0];

        for (int i = 0; i < x.length; i++)
        {
            if (x[i] != 0)
            {
                //Abfrage, falls zwischen den verschiedenen Gebiete keine 0 vorkommt
                //Prüft, ob das aktuelle X noch zum gleichen Gebiet gehört
                if (x[i] != lastArea)
                {
                    currentArea++;
                    lastArea = x[i];
                }

                y[i] = currentArea;
            }
        }
 
Zuletzt bearbeitet:
Ist eindeutig ein Spezifikationsproblem. Je nach dem ob die Nullen als Extrawurst durchgehen und/oder die Blöcke mit den gleichen Zahlen auch die gleichen Werte erhalten, gibts diese drei Lösungen :bae:
Java:
public static int[] solve1(int[] x) {
    int[] y = new int[x.length];
    int actual = 0;
    int pre = -1;
    for (int i = 0; i < x.length; i++) {
        if (x[i] != 0) {
            if (x[i] != pre) {
                pre = x[i];
                actual++;
            }
            y[i] = actual;
        }
    }
    return y;
}

public static int[] solve2(int[] x) {
    int[] y = new int[x.length];
    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    for (int i = 0; i < x.length; i++) {
        if (!map.containsKey(x[i])) {
            map.put(x[i], map.size());
        }
        y[i] = map.get(x[i]);
    }
    return y;
}

public static int[] solve3(int[] x) {
    int[] y = new int[x.length];
    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    for (int i = 0; i < x.length; i++) {
        if (x[i] != 0) {
            if (!map.containsKey(x[i])) {
                map.put(x[i], map.size() + 1);
            }
            y[i] = map.get(x[i]);
        }
    }
    return y;
}
 

Zurück
Oben