假设类型为string的一组数据格式如下:
[{“a”:”1”,”b”:”1”,”c”:”3”},{“a”:”2”,”b”:”1”,”c”:”2”},{“a”:”5”,”b”:”9”,”c”:”3”},…… ,{“a”:”3”,”b”:”4”,”c”:”5”},{“a”:”6”,”b”:”3”,”c”:”3”}]
请您根据以上的数据,设计一个接口,返回一组三角形的有序的数据集合,排序规则是:等边三角形->等腰三角形->普通三角形的数据集。请用面向对象的设计,来实现这个程序。
1、定义一个接口:
public interface ITriangleService
{
string GetTriangle(string jsonStr);
}
2、接口实现:
<pre name="code" class="csharp">public class TriangleService : ITriangleService
{
private List<Triangle> tiangles;
private string triangleStr;
public string GetTriangle(string jsonStr)
{
if (!string.IsNullOrWhiteSpace(jsonStr))
{
tiangles = new List<Triangle>();
List<ThreeSide> threeSide = new List<ThreeSide>();
threeSide = JsonConvert.DeserializeObject<List<ThreeSide>>(jsonStr);
//threeSide = JSON.ToObject<List<ThreeSide>>(jsonStr);
if (threeSide.Count > 0)
{
Triangle equilateral = new Triangle(TriangleCategory.Equilateral,new List<ThreeSide>()); //equilateral Triangle
Triangle isosceles = new Triangle(TriangleCategory.Isosceles, new List<ThreeSide>()); //isosceles Triangle
Triangle right = new Triangle(TriangleCategory.Right, new List<ThreeSide>()); //right Triangle
Triangle ordinary = new Triangle(TriangleCategory.Ordinary, new List<ThreeSide>()); //ordinary Triangle
Triangle notTriangle = new Triangle(TriangleCategory.Not, new List<ThreeSide>()); //notTriangle
foreach(ThreeSide ts in threeSide)
{
if (JudgeTriangle(ts)) //true:is a triangle
{
if (JudgeEquilateral(ts))
equilateral.ThreeSide.Add(ts);
else if (JudgeIsosceles(ts))
isosceles.ThreeSide.Add(ts);
else if (JudgeRight(ts))
right.ThreeSide.Add(ts);
else
ordinary.ThreeSide.Add(ts);
}
else//not a triangle
{
notTriangle.ThreeSide.Add(ts);
}
}
if (equilateral.ThreeSide.Count()>0)
tiangles.Add(equilateral);
if (isosceles.ThreeSide.Count() > 0)
tiangles.Add(isosceles);
if (right.ThreeSide.Count() > 0)
tiangles.Add(right);
if (ordinary.ThreeSide.Count() > 0)
tiangles.Add(ordinary);
if (notTriangle.ThreeSide.Count() > 0)
tiangles.Add(notTriangle);
triangleStr = JsonConvert.SerializeObject(tiangles);
//triangleStr = JSON.ToJSON(tiangles);
}
else
{
triangleStr = "Json format is error!";
}
}
else
{
triangleStr = "Json is null!";
}
return triangleStr;
}
private bool JudgeRight(ThreeSide ts)
{
return ts.c * ts.c + ts.a * ts.a == ts.b * ts.b || ts.c * ts.c + ts.b * ts.b == ts.a * ts.a || ts.a * ts.a + ts.b * ts.b == ts.c * ts.c;
}
private bool JudgeIsosceles(ThreeSide ts)
{
return (ts.a == ts.b || ts.c == ts.b || ts.a == ts.c) && !JudgeEquilateral(ts);
}
private bool JudgeEquilateral(ThreeSide ts)
{
return ts.c == ts.a && ts.c == ts.b && ts.a == ts.c;
}
private bool JudgeTriangle(ThreeSide ts)
{
return ts.c + ts.a > ts.b && ts.c + ts.b > ts.a && ts.a + ts.b > ts.c;
}
}
</pre><pre name="code" class="csharp"><pre name="code" class="csharp">3、在接口中用到的类和枚举
[Serializable]
public class Triangle
{
private TriangleCategory category;
List<ThreeSide> threeSide;
public Triangle(TriangleCategory c,List<ThreeSide> ts)
{
this.Category = c;
this.ThreeSide = ts;
}
public TriangleCategory Category
{
get { return category; }
set { category = value; }
}
public List<ThreeSide> ThreeSide
{
get { return threeSide; }
set { threeSide = value; }
}
}
[Serializable]
public class ThreeSide
{
public int a { get; set; }
public int b { get; set; }
public int c { get; set; }
}
枚举:
<pre name="code" class="csharp"> public enum TriangleCategory
{
Equilateral, Isosceles,Right,Ordinary,Not
}
</pre><pre>