Duplikate in Excel-Dateien finden

Hardi82

Mitglied
Hallo. Ich habe folgende Sache:

ich arbeite zur Zeit mit POI-HSSF und lese Exceldateien aus. Nun möchte ich die verschiedenen Formel-Zellen darauf untersuchen, ob diese "geklont" sind. Das bedeutet, ob die Formel in diesen sich nur durch unterschiedliche Zellenverweise unterscheiden. Als Bsp. Zelle 1 "=SUM(A1:X1)" und Zelle 2 "=SUM(A2:X2)" und so weiter. Da es mittels POI nur möglich ist, zeilenweise einzulesen habe ich mich dazu entschieden, einen TreeMap einzusetzen und als Key die Zellenbezeichnung zu nehmen und als Value die Formel einzutragen. Durch die automatische Sortierung erhalte ich dann in etwa folgendes:

A10 = "=SUM(A1:X1)"
A11 = "=SUM(A2:X2)"
...

und so weiter. Soweit bin ich damit auch zufrieden, ABER ich habe Problem bei folgender Konstellation:

A10 = "=SUM(A1:X1)"
A100 = "=A10"
A11 = "=SUM(A2:X2)"

Wie ihr sicher seht, sortiert die Map nicht genau nach Zahlen, sondern scheinbar nach Zeichenstellen oder so. Das wäre allerdings für meine folgende Untersuchung auf Geklontheit nicht so gut. Deshlab meine Frage: gibt es eine Möglichkeit, die Map "genauer" sortieren zu lassen, so dass die Reihenfolge "A10, A11, A100" herauskommt oder gibt es da eventuell eine andere Map, die dafür geeigneter ist? Danke schonmal für nützliche Tipps und Hinweise.

Gruß Hardie
 
Hi Hardie,

die TreeMap wird in Deinem Fall alphanumerisch sortiert.
Wenn Du das ändern willst, kannst Du bei der TreeMap im Konstruktor eine Comparator mitgeben.

Gruß
joschi
 
Aha, ich muss demnach einen eigenen Comparetor erzeugen und diesen dann mitliefern? Hast du eine Idee, wie der aussehen könnte, damit ich das geforderte Ergebnis erhalte?

Gruß
Hardie
 
Hi Hardie,

Du könntest es mal hiermit probieren.
Ist aber nicht gut getestet.

Java:
class TestComparator implements Comparator<String>{
    	public int compare(String s1, String s2){
   		
    		String alpha1 = s1.substring(0, getAlphaEndIndex(s1));
    		int numeric1 = Integer.parseInt(s1.substring(alpha1.length()));
    		
    		String alpha2 = s1.substring(0, getAlphaEndIndex(s2));
    		int numeric2 = Integer.parseInt(s2.substring(alpha2.length()));
    		
    		if(alpha1.compareTo(alpha2) != 0) {
    			return alpha1.compareTo(alpha2);
    		}
    		else {
    			return numeric1 - numeric2;
    		}


    	}
    	
    	private int getAlphaEndIndex(String s) {
    		int index = 0;
    		for(byte c : s.getBytes()) {
        		if (c >= 'A')
        			index++;
        	    else
        		  break;
    	    }
    		return index;
    	}

    }

Gruß
joschi
 
Zurück