Passende Klammern suchen und formatiert ausgeben

yidaki

Erfahrenes Mitglied
Hallo zusammen,

ich hab mal wieder ne kleien denksportaufgabe die mir im moment noch kopfzerbrechen bereitet. ich hab noch nicht angefangen zu programmieren, da ich bisher noch keine Lösung gefunden habe.

Also es geht um folgenden. man hat einen String
klammern="( [ { } < > ] < { ( ( ) [ ] ) < > } ( ( ) [ ] ) > )".
Die passenden Klammern sollen auf gleicher Höhe stehen.

Code:
                    ( ) [ ]
	  (         ) < >     ( ) [ ]
    { } < >     {                 } (         )
  [         ] <                                 >
(                                                 )

Das soll dann ungefähr so aussehen ;-)...

Also wenn jemand ne idee hat...

Falls ich drauf komme werde ich natürlich mein beitrag schreiben

gruß
 
Hallo!

Schau mal hier:
Code:
/*
 * Created on 06.01.2005@22:39:00
 *
 * TODO Licence info
 */
package de.tutorials;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

/**
 * @author Administrator
 * 
 * TODO Explain me...
 */
public class Brackets2 {

	private String str = "([{}<>]<{(()[])<>}(()[])>)";

	private Map levels = new TreeMap();

	private int startPos, endPos = str.length();

	public static void main(String[] args) {
		new Brackets2().doIt();
	}

	private void doIt() {
		List list = processBracketsConstruct(str, null);
		processBracketsConstructRecursive(list, 0);

		for (Iterator iter = levels.keySet().iterator(); iter.hasNext();) {
			List lst = (List) levels.get(iter.next());
			for (Iterator iterator = lst.iterator(); iterator.hasNext();) {
				String s = (String) iterator.next();
				printCleanBrackets(s);
				if (iter.hasNext())
					System.out.print(",");
			}
			System.out.println();
		}
	}

	/**
	 * @param s
	 */
	private void printCleanBrackets(String s) {
		StringBuffer sb = new StringBuffer(s);
		int idx0 = 1;
		int idx1 = s.length() - 1;
		char[] cA = new char[idx1 - idx0];
		Arrays.fill(cA, ' ');
		sb.replace(idx0, idx1, new String(cA));
		System.out.print(sb);
	}

	private void processBracketsConstructRecursive(List list, int level) {
		int lev = ++level;
		for (Iterator iter = list.iterator(); iter.hasNext();) {
			int[] pos = (int[]) iter.next();
			String s = str.substring(pos[0], pos[1] + 1);

			Integer itg = Integer.valueOf(lev);
			Key key = new Key(itg);
			List lst = (List) levels.get(key);
			if (lst == null)
				lst = new ArrayList();
			lst.add(s);
			levels.put(key, lst);

			pos[0]++;
			processBracketsConstructRecursive(
					processBracketsConstruct(str, pos), lev);
		}

	}

	private List processBracketsConstruct(String s, int[] positions) {
		List list = new ArrayList();

		char startSequence = 0;
		char last = 0;
		int occurence = 0;

		int[] pos = new int[3];

		if (positions != null) {
			startPos = positions[0];
			endPos = positions[1];
		} else {
			startPos = 0;
		}

		for (int i = startPos; i < endPos; i++) {
			char c = s.charAt(i);

			if (startSequence == 0) {
				if ("<([{".indexOf(c) >= 0) {
					startSequence = c;
					pos[0] = i;
				}
			} else {

				if (c == ')' && startSequence == '(') {
					if (--occurence == 0) {
						startSequence = 0;
						pos[1] = i;
						list.add(pos);
						pos = new int[2];
					}
				}

				if (c == ']' && startSequence == '[') {
					if (--occurence == 0) {
						startSequence = 0;
						pos[1] = i;
						list.add(pos);
						pos = new int[2];
					}
				}

				if (c == '}' && startSequence == '{') {
					if (--occurence == 0) {
						startSequence = 0;
						pos[1] = i;
						list.add(pos);
						pos = new int[2];
					}
				}

				if (c == '>' && startSequence == '<') {
					if (--occurence == 0) {
						startSequence = 0;
						pos[1] = i;
						list.add(pos);
						pos = new int[2];
					}
				}
			}
			last = c;
			if (last == startSequence)
				occurence++;
		}

		return list;
	}

	class Key implements Comparable {
		private Integer val;

		public Key(Integer val) {
			this.val = val;
		}

		public int compareTo(Object arg0) {
			Key other = (Key) arg0;
			return -this.val.compareTo(other.val);
		}
	}
}

Ausgabe:
Code:
(),[],
(    ),<>,(),[],
{},<>,{        },(    ),
[    ],<                >,
(                        )

Gruß Tom
 
Zurück