水曜日, 2月 25, 2015

Java: データ・マイニング ECLAT変換

データ・マイニングなんぞでデータ変換など需要がありましたので、プログラムなど置いておきます。

変換といっても縦のものを横にするという種類のもので、こんな感じです。


 アルファベットが項目で、数字がIDです。

走らせるとアルファベットからIDを列挙します。

import java.util.*;
// Equivalence Class Transformation
public class ECLAT
{
public static void main(String args[])
{
HashMap<Integer, byte[]> hash=new HashMap<>();
hash.put(10,new String("acde").getBytes());
hash.put(20,new String("abe").getBytes());
hash.put(30,new String("bce").getBytes());
Set<Integer> keys=hash.keySet();
TreeSet<Integer> sortedKeys=new TreeSet<>();
TreeSet<Character> itemset=new TreeSet<>();
for(Integer key: keys)
{
sortedKeys.add(key);
}
for(Integer key: sortedKeys)
{
System.out.print(key+" | ");
byte[] buf=hash.get(key);
for(int i=0;i<buf.length;i++)
{
itemset.add((char)buf[i]);
System.out.print((char)buf[i]);
if(i<buf.length-1)
System.out.print(",");
}
System.out.println();
}
System.out.println();
for(Character ch: itemset)
{
System.out.print(ch+" | ");
for(Integer key: sortedKeys)
{
byte[] buf=hash.get(key);
int i=0;
while(buf[i]!=ch && ++i<buf.length){}
if(i<buf.length)
{
System.out.print(key+", ");
}
}
System.out.println();
}
}
}
view raw ECLAT.java hosted with ❤ by GitHub

火曜日, 2月 24, 2015

Java: 楕円銀河

銀河系ってのはさまざまな形をしていますが、楕円形ってのがもっとも多いわけです。

楕円形のつぶれかたで記号までついてるわけですね。

E0 から E7 まであるわけですが、E0 がもっとも丸い。E7 がつぶれた形をしている。



こんなのを Java でインタラクティブで動かせたらいいかな、というんで書いてみました。

そのままコンパイルすると動くはずです。です。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;
public class EllipticalGalaxies
{
public static void main(String args[])
{
new EllipticalFrame();
}
}
class EllipticalFrame extends JFrame implements ActionListener
{
EllipticalPanel panel=new EllipticalPanel();
JButton plus=new JButton("+");
JButton minus=new JButton("-");
EllipticalFrame()
{
setTitle("Elliptical Gallaxies");
setSize(500,500);
setVisible(true);
JPanel control=new JPanel();
control.setLayout(new FlowLayout());
control.add(plus);
control.add(minus);
getContentPane().add(control,BorderLayout.NORTH);
getContentPane().add(panel,BorderLayout.CENTER);
plus.addActionListener(this);
minus.addActionListener(this);
}
public void actionPerformed(ActionEvent event)
{
String cmd=event.getActionCommand();
if(cmd.equals("+"))
{
panel.n++;
repaint();
}
else
{
panel.n--;
repaint();
}
if(7<panel.n)
panel.n=7;
if(panel.n<0)
panel.n=0;
}
}
class EllipticalPanel extends JPanel
{
int n=0;
public void paint(Graphics graphics)
{
Graphics2D g=(Graphics2D)graphics;
int w=getWidth();
int h=getHeight();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g.setColor(Color.black);
g.fillRect(0,0,w,h);
g.setColor(Color.white);
int r=(int)w/8;
int x0=r;
int y0=r;
int d=(int)3*w/4;
if (w<h)
{
h=(int)w/8;
d=(int)3*w/4;
}
y0=(int)((h-d)*.5);
y0=(int)((h-(1-n/10.0)*d)*.5);
int dh=(int)(((1-n/10.0)*d));
float dash[]={10.0f};
Stroke stroke=new BasicStroke(3.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, dash, 0.0f);
g.setStroke(stroke);
g.draw(new Ellipse2D.Double(x0,y0,d,dh));
g.setColor(Color.white);
Font font=new Font("Arial",Font.BOLD,30);
FontMetrics fm=g.getFontMetrics(font);
String label="E"+n;
int stringWidth=fm.stringWidth(label);
int stringHeight=fm.getHeight();
g.setFont(font);
g.drawString(label,(int)((w-stringWidth)*.5),(int)((h+stringHeight*.5)*.5));
}
}
view raw gistfile1.txt hosted with ❤ by GitHub

Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...