プログラミング」カテゴリーアーカイブ

Eclipse4.3.2でJava8を書けるようにする

EclipseでのJava8のサポートは6月にリリースされる予定の4.4から

Eclipse 4.3 KeplerでJava8の構文を使おうとすると以下の様にエラーが出てしまう
eclipse_java8_non_support

4.4が出るまで待てないので、4.3.2用のJava8サポートパッチをインストールする
JDT/Eclipse Java 8 Support For Kepler – Eclipsepedia
https://wiki.eclipse.org/JDT/Eclipse_Java_8_Support_For_Kepler

addedEclipsePatch
インストールして再起動したのち、コンパイラー設定を1.8に変更すればコンパイルが通るようになる
preferenceJava8

eclipse_java8_support

Ruby koansでRubyを学ぶ

Rails Hub情報局: 禅の公案(Koan)がプログラミング学習でプチブーム

を読んでおもしろそうだったのでやってみました

このRuby koansはRubyのテストケースを通してRubyの仕様が学べるものです

http://rubykoans.com/からダウンロードして実行するだけです。

実行するとエラーが表示されるのでそれを修正していく形になります

正解していれば次のエラーが表示されるのであとはひたすら解いていくだけです

Rubyをほとんどやったことがない私ですが

nilの扱いやオブジェクトについての知識が少なからず身につきました

f:id:carme-264pp:20110201224338p:image

実行画面

f:id:carme-264pp:20110201224339p:image

修正するコード

NumberMagicEasyリベンジ編

[追記]10/24 1:39 タイトル修正、表の修正

前回書いたコードがあまりにもひどいのでやり直してみました。

入力される文字列に対しての数値に注目すると、以下のようなことが分かります。

入力 出力 入力 出力
YYYY 1 NYYY 9
YYYN 2 NYYN 10
YYNY 3 NYNY 11
YYNN 4 NYNN 12
YNYY 5 NNYY 13
YNYN 6 NNYN 14
YNNY 7 NNNY 15
YNNN 8 NNNN 16

よく見てみると入力をY=0、N=1として見ると2進数を10進数で返していることが分かります。

上の表を”0″,”1″で置換してみるとこうなります。

入力 出力 入力 出力
0000 1 1000 9
0001 2 1001 10
0010 3 1010 11
0011 4 1011 12
0100 5 1100 13
0101 6 1101 14
0110 7 1110 15
0111 8 1111 16

ということで、プログラムの流れとしては、

入力された文字列を1と0に置き換え
↓
10進数に変換
↓
1増やして返す

となります。

で、実装するとこうなります。

public class NumberMagicEasy {
public int theNumber(String answer) {
answer = answer.replace('Y', '0');
answer = answer.replace('N', '1');
return Integer.parseInt(answer, 2) + 1;
}
}

前回のものと比べるとかなりシンプルになりました。

これは翌朝の通学中に気付いたわけですが、

TopCoderでは回答時間内にこういったことを考えコードを書いているので

わたしはまだまだですね。

前回のコードを書いた奴を殴りたい。

Topcoderをやってみた

Topcoderデビュー

NumberMagicEasyという問題に挑戦。

言語はJavaでやってみました。

Eclipse + JUnitでデバッグしながら何とか完成。

我ながら酷いコードだと思います

public class NumberMagicEasy {
private final static int[][] cards = { { 1, 2, 3, 4, 5, 6, 7, 8 },
{ 1, 2, 3, 4, 9, 10, 11, 12 },
{ 1, 2, 5, 6, 9, 10, 13, 14 },
{ 1, 3, 5, 7, 9, 11, 13, 15 } };
private int[] hit = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
private int[] no = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
public int theNumber(String answer) {
int n = 0;
while (n < answer.length()) {
if (answer.startsWith("Y", n)) {
for (int i = 0; i < 8; ++i) {
hit[cards[n][i] - 1]++;
}
} else if (answer.startsWith("N", n)) {
for (int i = 0; i < 8; ++i) {
no[cards[n][i] - 1]++;
}
}
n++;
}
for (int i = 0; i < hit.length; ++i) {
if (hit[i] > 0 && no[i] == 0) {
return i + 1;
}
}
return 16;
}
}

追記

NumberMagicEasyリベンジ編へ続く

JAXBでのXMLファイル入出力クラス

JAXBContextを使用したXMLの読み書きクラスと、

XMLSchemaのサンプルです。

XMLSchemaファイルをXJCでコンパイルしておくこと

XmlReader.java

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import org.hoge.xml.MemberList;
public class XmlReader {
private String filename;
private JAXBContext jaxbc;
XmlReader(String xmlFileName) throws JAXBException {
this.filename = xmlFileName;
jaxbc = JAXBContext.newInstance(MemberList.class);
}
public MemberList readListXml() throws JAXBException, IOException {
InputStream listIs = new FileInputStream(filename);
Unmarshaller um = jaxbc.createUnmarshaller();
MemberList list = (MemberList) um.unmarshal(listIs);
listIs.close();
return list;
}
public void writeListXml(MemberList getList) throws JAXBException, IOException {
OutputStream os = new FileOutputStream(filename);
Marshaller mu = jaxbc.createMarshaller();
mu.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
mu.marshal(getList, os);
os.close();
}
}

memberList.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="memberList">
<xsd:complexType>
<xsd:sequence minOccurs="1" maxOccurs="unbounded">
<xsd:element name="member" type="memberType" />
</xsd:sequence>
<xsd:attribute ref="listName" />
</xsd:complexType>
</xsd:element>
<xsd:complexType name="memberType">
<xsd:sequence>
<xsd:element ref="name" />
<xsd:element ref="joinDate" />
<xsd:element ref="url" />
<xsd:element ref="comment" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="name" type="xsd:string" />
<xsd:element name="joinDate" type="xsd:date" />
<xsd:element name="url" type="xsd:anyURI" />
<xsd:element name="comment" type="xsd:string" />
<xsd:attribute name="listName" type="xsd:string" />
</xsd:schema>

やっつけです。はい