📄 riesarray.java
字号:
import java.math.*;
import java.util.*;
public class RiesArray
{
public static String bi_to_n(String s) throws NumberFormatException
{
int x=0;
BigInteger k=new BigInteger("2");
BigInteger ergebnis=new BigInteger("0");
for(int i=s.length()-1;i>=0;i--)
{
char ch=s.charAt(i);
BigInteger a=new BigInteger(new Character(ch).toString());
if((a.toString().equals("0")) || (a.toString().equals("1")))
{
BigInteger big=(k.pow(x)).multiply(a);
ergebnis=ergebnis.add(big);
//System.out.println(a.toString()+" "+x+" "+" "+big+" "+ergebnis.toString());
x++;
}
else
{throw new NumberFormatException();}
}
return ergebnis.toString();
}
public static String n_to_k(BigInt k,String s,String alphabet)
{
BigInt a=new BigInt(s);
String k_ergebnis="";
String end_ergebnis="";
String end_ergebnis1="";
while(a.ne(new BigInt("0")))
{
k_ergebnis+=(a.mod(k)).toString();
a=a.divide(k);
}
for(int i=k_ergebnis.length()-1;i>=0;i--)
{
end_ergebnis+=k_ergebnis.charAt(i);
}
for(int i=0;i<end_ergebnis.length();i++)
{
int index=Integer.parseInt(new Character(end_ergebnis.charAt(i)).toString());
end_ergebnis1+=new Character(alphabet.charAt(index)).toString();
}
return end_ergebnis1;
}
/*
*Sorgt fu;¨r die m-stellige Bina;¨rdarstellung von n mit fu;¨hrenden Nullen
*@return String
*@param String s : Eine Zahl, int m
*
*/
public static String shiften(String s,int m)
{
String zwischenString="";
for (int i=0;i<m;i++)
{
zwischenString+="0";
}
String ergebnis=zwischenString+s;
return ergebnis;
}
/*
*Jedes Bit einer Zahl in Bina;¨rdarstellung wird verdoppelt
*@param String s:Eine Zahl
*@return String
*/
public static String verdoppeln(String s)
{
String ergebnis="";
for(int i=0;i<s.length();i++)
{
char c=s.charAt(i);
ergebnis+=String.valueOf(c)+String.valueOf(c);
}
return ergebnis;
}
/*
*Array wird als eine Zahl in Bina;¨rdarstellung kodiert.Dabei wird zwischen Werte und
*Header unterschieden.Der Header beinhaltet die Anzahl der Elemente des Arrays und die
*Länge eines einzelnes Eintrags in Bits.Das niedrigwertigste Bit des Headers ist eine
*Null um eindimensionales von einem mehrdimensionalen Array unterscheiden zu können.
*@param String s
*/
public void array_to_RiesArray(String s)
{
ArrayList stringList=new ArrayList();//hier werden alle Arraywerte als Strings gespeichert
String stringErgebnis="";
StringTokenizer t=new StringTokenizer(s,",");
int max=0;//Maximale L鋘ge der Zahl im Array
while(t.hasMoreTokens()) //In dieser Schleife wird maximale L鋘ge der Zahl im Array
{
String str=t.nextToken();
String str1=n_to_k(new BigInt("2"),str,"01");
if(str1.length()>max)
max=str1.length();
stringList.add(str1);
}
for(int i=0;i<stringList.size();i++)//Es wird geschiftet und verdoppelt
{
String str=stringList.get(i).toString();
if(max>str.length())
{
str=shiften(str,max-str.length());
str=verdoppeln(str);
}
else{
str=verdoppeln(str);
}
stringList.set(i,str);
}
for(int i=(stringList.size()-1);i>=0;i--)//Ergebnisstring wird gebildet
{
stringErgebnis+= stringList.get(i).toString();
}
//header wird hinzugef黦t
//String header="01"+verdoppeln(n_to_k(new BigInt("2"),new Integer(stringList.size()).toString(),"01"))+
//"01"+verdoppeln(n_to_k(new BigInt("2"),new Integer(max).toString(),"01"))+"0";
String anzahl="01"+verdoppeln(n_to_k(new BigInt("2"),new Integer(stringList.size()).toString(),"01"));
String maxLaenge="01"+verdoppeln(n_to_k(new BigInt("2"),new Integer(max).toString(),"01"))+"0";
//String gesamtErgebnis=stringErgebnis+header;
setWerte(stringErgebnis);
setHeader(new Header(anzahl,maxLaenge));
//return new BigInt(gesamtErgebnis);
}
/*
*Die Verdoppelung wird aufgehoben
*@param String
*@return String
*/
private static String reduzieren(String s)
{
String ergebnis="";
for(int i=0;i<s.length();i=i+2)
{
char c=s.charAt(i);
ergebnis+=String.valueOf(c);
}
return ergebnis;
}
/*
*Zugriff auf eine bestimmte Position in einem Array
*@param int - index
*@return BigInt
*/
public BigInt get(int pos)
{
String ergebnis="";
Header h=getHeader();
String laenge=h.getMaxLaenge();
laenge=bi_to_n(reduzieren(laenge.substring(2,laenge.length()-1)));
int begin=pos*Integer.parseInt(laenge)*2;
int end=begin+Integer.parseInt(laenge)*2;
ergebnis=getWerte().substring(begin,end);
ergebnis=reduzieren(ergebnis);
System.out.println("Laenge: "+begin+"\t"+end);
return new BigInt(bi_to_n(ergebnis));
}
/*
*Zugriff auf eine bestimmte Position in einem Array
*@param BigInt
*@return BigInt
*/
public BigInt get(BigInt position)
{
String ergebnis="";
String posit=position.toString();
int pos=Integer.parseInt(posit);
Header h=getHeader();
String laenge=h.getMaxLaenge();
laenge=bi_to_n(reduzieren(laenge.substring(2,laenge.length()-1)));
int begin=pos*Integer.parseInt(laenge)*2;
int end=begin+Integer.parseInt(laenge)*2;
ergebnis=getWerte().substring(begin,end);
ergebnis=reduzieren(ergebnis);
//System.out.println("Laenge: "+begin+"\t"+end);
return new BigInt(bi_to_n(ergebnis));
}
/*
*Gibt Anzahl der Elemente in einem Array zurück
*@return BigInt
*/
public BigInt getLength()
{
//String ergebnis="";
Header h=getHeader();
String anzahl=h.getAnzahl();
anzahl=bi_to_n(reduzieren(anzahl.substring(2,anzahl.length())));
return new BigInt(anzahl);
}
public RiesArray()
{}
public RiesArray(String werte,Header head)
{
Werte=werte;
header=new Header(head.getAnzahl(),head.getMaxLaenge());
}
private String getWerte()
{
return Werte;
}
private Header getHeader()
{
return header;
}
private void setWerte(String werte)
{
Werte=werte;
}
private void setHeader(Header head)
{
header=new Header(head.getAnzahl(),head.getMaxLaenge());
}
public String toString()
{
return Werte+header.toString();
}
private String Werte;
private Header header;
public static void main (String[]args)
{
int i=13;
String s=n_to_k(new BigInt("2"),"13","01");
System.out.println(s+" Anzahl der Bits= "+s.length()+" Mit Shift um 2= "+shiften(s,2));
System.out.println(verdoppeln(s)+" Dezimaldarstellung= "+bi_to_n(s));
String array="10,24,7,13,3,3,3,3,3";
RiesArray arr=new RiesArray();
//BigInt a=array_to_BigInt(array);
//System.out.println(array+"\t" +a+"\t"+ a.andNot(a));
arr.array_to_RiesArray(array);
//System.out.println(get(a,new BigInt("0")).toString());
System.out.println(arr.getWerte()+"\t"+arr.getHeader());
System.out.println(arr.toString());
System.out.println("Ergebnis: "+arr.getLength());
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -